Sistema web completo para gerenciamento e compartilhamento de receitas culinárias, com design inspirado em jornais clássicos.
🔗 Acesse online: (https://jornal-de-receitas.vercel.app/)
O Jornal de Receitas é uma aplicação web que permite que usuários cadastrem, compartilhem e encontrem receitas culinárias. O sistema conta com dois níveis de acesso (usuário comum e administrador), sistema de aprovação de receitas enviadas, favoritos, filtros de busca, notificações em tempo real e um painel administrativo completo.
O visual é inspirado em jornais impressos clássicos, com identidade em vinho (#8b0000) e dourado (#d4af37), tipografia serifada (DM Serif Display, Playfair Display) e cards em estilo brutalist suavizado.
O projeto segue o padrão MVC no backend, com separação em camadas (Controller → Service → DAO → Model), e um frontend SPA (Single Page Application) em React consumindo a API REST. Implementa os seguintes Design Patterns:
Abstrai o acesso ao banco com interfaces (IReceitaDAO, IUsuarioDAO, ICarrosselDAO, IFavoritoDAO, INotificacaoDAO, IEstatisticasDAO, ISiteConfigDAO) e implementações específicas (ReceitaDAOImpl, UsuarioDAOImpl, etc). Os Services dependem apenas das interfaces, permitindo trocar a tecnologia de persistência sem alterar a lógica de negócio.
- Model: entidades JPA (
Receita,Usuario,Favorito,Notificacao,Estatisticas,CarrosselItem,SiteConfig) - View: SPA em React (Vite + React Router)
- Controller: expõe endpoints REST, delega aos Services e retorna JSON
Encapsula operações de negócio como objetos (AprovarReceitaCommand, RejeitarReceitaCommand, ExcluirReceitaCommand, AtualizarEstatisticasCommand), executados pelo CommandInvoker sem que este conheça os detalhes internos de cada operação.
Centraliza a criação de objetos complexos (ReceitaFactory, NotificacaoFactory, UsuarioFactory), reduzindo duplicação e deixando explícitas as regras de criação.
Constrói objetos passo a passo (ReceitaBuilder, UsuarioBuilder, NotificacaoBuilder, FavoritoBuilder, CarrosselBuilder, EstatisticasBuilder, SiteConfigBuilder), tornando a configuração mais legível e flexível.
- S: cada classe tem uma responsabilidade única (Controllers, Services, DAOs, Commands)
- O: novos Comandos e Factories são adicionados sem alterar código existente
- L: as implementações de DAO substituem suas interfaces sem quebrar contratos
- I: interfaces específicas por entidade
- D: Services e Controllers dependem de abstrações (interfaces DAO)
- Cadastro de novos usuários
- Login e logout seguro
- Edição de perfil (nome, e-mail, telefone, gênero, senha)
- Dois níveis de acesso:
USEReADMIN - Ativação/desativação de contas pelo administrador
- Envio de receitas com título, tempo, porções, chefe, categoria (Salgado/Doce), ingredientes, modo de preparo e imagem
- Sistema de aprovação: receitas enviadas ficam pendentes até aprovação do admin
- Listagem de receitas aprovadas separadas por categoria (Salgados / Doces)
- Visualização detalhada com checklist interativo de ingredientes e passos numerados
- Favoritar / desfavoritar receitas
- Aba dedicada a receitas favoritas
- Exclusão de receitas pelo próprio usuário
- Adicionar e remover receitas dos favoritos
- Aba dedicada com todas as receitas favoritadas
- Modal de resumo dos favoritos com total de favoritos, ingredientes disponíveis e ingredientes que se repetem entre as receitas
- Busca dinâmica por ingrediente: select que consulta em tempo real quantas receitas favoritas contêm aquele ingrediente e lista os títulos correspondentes
- Filtro por nome, categoria e porções na tela inicial
- Busca paginada nas telas administrativas
- Notificações de novas receitas enviadas
- Notificações de receitas aprovadas e rejeitadas
- Notificações ao favoritar e desfavoritar receitas
- Notificações de receitas excluídas
- Contador de notificações não lidas no cabeçalho
- Marcação individual ou de todas as notificações como lidas
- Toasts (feedback visual) para cada ação realizada
- Polling a cada 10 segundos — notificações e dados atualizam automaticamente sem necessidade de refresh
- Gerenciamento completo pelo admin (adicionar, editar, ativar/desativar, excluir)
- Suporte a URL de imagem ou upload de arquivo
- Atualização automática via polling
- Dashboard: cards com totais (usuários, receitas por status, favoritos) e gráficos (status de receitas, top 5 mais favoritadas)
- Usuários: listagem paginada, busca, edição, exclusão e ativação/desativação
- Receitas pendentes: listagem, busca, visualização em modal, edição, aprovação e rejeição
- Receitas aprovadas: listagem, busca, visualização em modal, edição e exclusão
- Receitas rejeitadas: listagem, busca, visualização em modal e consulta do motivo da rejeição
- Carrossel: gerenciamento dos itens exibidos na home
- Edição de perfil do próprio admin
- Sidebar responsiva com overlay no mobile
- Design responsivo (mobile, tablet e desktop) com breakpoints dedicados
- Cabeçalho fixo com estado "scrolled" (encolhe ao rolar, exceto em telas específicas)
- Sidebar mobile com overlay e blur
- Carrossel de receitas em destaque
- Modais elegantes e acessíveis (componente
<Modal>genérico reutilizável) - Toasts profissionais via PrimeReact Toast
- Tabs para organização das receitas
- Preview de imagens antes do envio
- Validação dos campos obrigatórios dos formulários
- Loader global de página e spinner em botões de ação
- Loader inline (3 anéis girando) para conteúdo de modais
- Checklist interativo nos ingredientes (risca o item ao marcar)
- Lazy loading de imagens com fallback "Imagem indisponível"
- Scrollbar customizada fina e moderna
| Tecnologia | Versão | |
|---|---|---|
| Java | 21 | |
| Spring Boot | 3.5.5 | |
| Spring Security | 6.x | |
| Hibernate | 6.6 | |
| MySQL | 8.0 | |
| Maven | 3.8+ | |
| SpringDoc OpenAPI | 2.x |
| Tecnologia | Versão | |
|---|---|---|
| React | 19 | |
| Vite | 8 | |
| React Router | 7 | |
| Axios | 1.20 | |
| PrimeReact | 10 | |
| PrimeIcons | 7 | |
| Font Awesome | 6.5 | |
| Chart.js (via PrimeReact) | 4.x | |
| HTML5 | — | |
| CSS3 | — |
| Tecnologia | |
|---|---|
| Docker | |
| GitHub | |
| DigitalOcean / Vercel |
| Tabela | Descrição |
|---|---|
usuario |
Usuários cadastrados (nome, email, cpf, senha, role, ativo) |
receita |
Receitas enviadas (título, ingredientes, modo preparo, imagem, categoria, status) |
favorito |
Relação usuário × receita favoritada |
notificacao |
Notificações vinculadas aos usuários |
estatisticas |
Estatísticas por usuário (receitas, favoritos, notificações) |
carrossel |
Itens exibidos no carrossel da home |
site_config |
Configurações dinâmicas (favicon, imagens de destaque) |
Relacionamentos:
usuario1:1estatisticasreceitan:1usuariousuario1:nfavoritousuario1:nnotificacaoreceitan:1favorito
Tabelas sem relacionamento direto:
carrossel— gerenciado exclusivamente pelo admin, sem vínculo com usuáriosite_config— configurações globais do site, sem vínculo com usuário
- Domínio — entidades, enums, builders e relacionamentos
- DAOs — interfaces, implementações e JpaRepositorys
- Commands — Command, BaseCommand, comandos concretos e CommandInvoker
📁 Em /Diagramas/Diagrama de Classe
Total de 30 diagramas, organizados por domínio, todos fiéis ao código atual (PlantUML):
- Autenticação (3): Cadastro, Login, Logout
- Usuário (5): Buscar usuário logado, Editar Perfil, Editar Usuário (admin), Ativar/Desativar, Excluir
- Receita (10): Criar, Editar, Aprovar, Rejeitar, Excluir, Listar Aprovadas (home), Minhas Receitas, Listar Pendentes (admin), Listar Rejeitadas (admin), Listar Aprovadas (admin)
- Favorito (3): Favoritar, Desfavoritar, Listar
- Notificação (5): Listar, Listar não lidas, Contador, Marcar como lida, Marcar todas como lidas, Excluir todas
- Carrossel (6): Listar público, Listar admin, Adicionar, Editar, Alternar status, Excluir
📁 Em /Diagramas/Diagramas de Sequência
A API REST do projeto está totalmente documentada com SpringDoc OpenAPI e disponível via Swagger UI.
Acesso online: /swagger-ui/index.html
Swagger é uma interface visual que mostra todos os endpoints REST de uma API. Permite visualizar:
- As rotas disponíveis
- Os parâmetros esperados (com descrição e exemplo)
- Os possíveis retornos (códigos HTTP e exemplos de resposta)
- O schema de cada entidade
Também permite testar os endpoints direto no navegador, sem precisar de ferramentas externas.
SpringDoc é a biblioteca que lê o código Spring Boot e gera a documentação OpenAPI automaticamente. Com o SpringDoc, basta anotar os controllers com @Tag, @Operation, @ApiResponses, @Parameter e os models com @Schema — e o Swagger exibe tudo com exemplos reais.
38 endpoints REST documentados, agrupados em 5 tags:
| Grupo | Endpoints documentados |
|---|---|
| Usuários | cadastro, login, logout, buscar usuário logado, editar perfil, listar usuários, buscar por ID, editar usuário, ativar/desativar, excluir |
| Receitas | listar aprovadas (home), listar minhas, listar pendentes, listar rejeitadas, listar aprovadas (admin), buscar por ID, criar, editar, aprovar, rejeitar, excluir |
| Favoritos | adicionar, remover, listar, resumo geral, resumo por ingrediente |
| Notificações | listar todas, listar não lidas, contador, marcar como lida, marcar todas como lidas, excluir todas |
| Carrossel | listar ativos (público), listar todos (admin), adicionar, editar, alternar status, excluir |
- ✅
@Tagem todos os controllers (5 grupos organizados) - ✅
@Operationcom summary e description em todos os 38 endpoints - ✅
@ApiResponsescom@Contente exemplos reais de resposta - ✅
@Parameterem todos os path variables e query params (com descrição e exemplo) - ✅
@Schemaem todos os models (Usuario,Receita,CarrosselItem,Notificacao,Favorito) - ✅
@SecurityRequirementnos endpoints autenticados (cookie de sessão) - ✅
multipart/form-datacorreto nos endpoints de upload de imagem
Vulnerabilidades neutralizadas:
| Vulnerabilidade | Como foi neutralizada |
|---|---|
| SQL Injection | JPA/Hibernate com queries parametrizadas |
| Senhas em texto puro | BCrypt (BCryptPasswordEncoder) |
| Autenticação / Autorização | Spring Security com roles ADMIN e USER |
| Exposição de senha em JSON | Campo anotado com @JsonIgnore e @Schema(accessMode = WRITE_ONLY) |
| CSRF | Desabilitado apenas para APIs REST (frontend é SPA separado) |
| CORS | Configurado para permitir apenas a origem do frontend React |
| Sessão | Cookie JSESSIONID com HttpOnly e Secure em produção |