Objetivo
O objetivo do trabalho é transformar o template em uma aplicação real de outro domínio. O aluno deverá demonstrar domínio de autenticação, sessão, CRUD, modelagem de banco de dados, relacionamento entre tabelas, validações, organização em camadas e regras de negócio.
A aplicação final não deve ser apenas uma troca de nomes. Ela precisa ter decisões próprias de modelagem, fluxos de uso coerentes e funcionalidades que façam sentido para o tema escolhido.
Temas Possíveis
Livros, autores, categorias, empréstimos, avaliações e capas.
Eventos, categorias, participantes, inscrições, cartazes e comentários.
Produtos, categorias, pedidos, itens do pedido, estoque e imagens.
Pacientes, médicos, consultas, procedimentos e histórico de atendimento.
Receitas, ingredientes, categorias, tags, imagens e avaliações.
Álbuns, artistas, músicas, playlists, tags e capas.
Requisitos Obrigatórios
- Usar PHP puro com MySQL, partindo do template fornecido.
- Implementar login, logout e controle de sessão.
- Bloquear páginas internas para usuários não autenticados.
- Criar uma entidade principal diferente de Pokémon.
- Implementar CRUD completo da entidade principal: criar, listar, editar, excluir e buscar por ID.
- Modelar um banco de dados com pelo menos 4 tabelas.
- Ter pelo menos um relacionamento 1:N.
- Ter pelo menos um relacionamento N:N com tabela intermediária.
- Usar Repository para todo acesso ao banco. As páginas não devem conter SQL diretamente.
- Usar Entity para representar os objetos principais da aplicação.
- Implementar validações de entrada e mensagens claras de erro/sucesso.
Relacionamento N para N
O projeto deve conter pelo menos um relacionamento muitos-para-muitos. Esse relacionamento deve ser representado por uma tabela intermediária e também deve aparecer na interface.
Exemplos:
livro,autor,livro_autorevento,participante,evento_participanteplaylist,musica,playlist_musicapedido,produto,pedido_itemreceita,tag,receita_tag
Upload de Imagem
A entidade principal deve permitir o cadastro de uma imagem.
Exemplos: capa de livro, foto de produto, cartaz de evento, imagem da receita, capa de álbum ou avatar de personagem.
- Aceitar apenas formatos como
jpg,pngouwebp. - Definir limite máximo de tamanho do arquivo.
- Salvar o arquivo em uma pasta como
uploads/. - Salvar no banco apenas o caminho ou nome do arquivo.
- Exibir a imagem na listagem ou na página de detalhe.
- Permitir trocar ou remover a imagem.
Funcionalidades Recomendadas
Página de detalhe
Criar uma página própria para visualizar todos os dados de um registro, incluindo imagem e relacionamentos.
Busca e filtros
Permitir buscar por texto, filtrar por categoria, status, usuário, data ou tags.
Status com regra
Usar status como rascunho, publicado, encerrado, disponível, emprestado ou arquivado.
Comentários ou avaliações
Permitir nota de 1 a 5, comentário por usuário ou média de avaliações.
Recursos Extras
Os recursos abaixo podem ser usados para diferenciar projetos mais completos:
- Cadastro de novo usuário.
- Validação de cadastro por email usando token.
- Recuperação de senha por email ou link de redefinição.
- Edição de perfil com avatar.
- Permissões de usuário comum e administrador.
- Soft delete com campo
excluido_em. - Tela de lixeira para restaurar registros excluídos.
- Favoritos ou coleção pessoal por usuário.
- Histórico de ações em tabela de auditoria.
- Campos calculados, como total de pedido, média de nota ou dias restantes para um evento.
Regras de Negócio nas Entidades
Parte das regras de negócio deve ficar dentro das entidades, não apenas nas páginas ou repositories. O objetivo é que o objeto proteja o próprio estado.
Exemplos:
$evento->publicar()impede publicar evento sem data.$livro->marcarComoEmprestado()impede emprestar livro já emprestado.$produto->baixarEstoque($quantidade)impede estoque negativo.$receita->publicar()exige título, categoria e pelo menos um ingrediente.
Versionamento e Apresentação
- O projeto deve ser versionado em um repositório no GitHub.
- Todos os integrantes do grupo devem apresentar commits próprios no histórico do repositório.
- Os commits devem demonstrar participação real no desenvolvimento, não apenas alterações simbólicas no final.
- Não será considerado adequado apresentar poucos commits com muitas alterações acumuladas de uma só vez.
- O histórico deve mostrar commits distribuídos ao longo do processo de desenvolvimento, com antecedência mínima de uma semana em relação à apresentação.
- A avaliação será presencial.
- Turma DS313: avaliação em 2 de junho.
- Turma DS315: avaliação em 5 de junho.
- Durante a apresentação, haverá arguição oral sobre o código, a modelagem do banco, as decisões de arquitetura e as funcionalidades implementadas.
- Todos os integrantes devem estar preparados para explicar partes do projeto.