Projeto prático da disciplina de Programação Orientada a Objetos (CCM310), lecionada pela Prof. Dra. Gabriela Biondi. O objetivo é construir uma plataforma de pedidos de alimentos inspirada no iFood, aplicando os conceitos de MVC, JDBC e Orientação a Objetos.
Este projeto cumpre todos os entregáveis solicitados no Projeto_FEIFood.pdf:
-
Código Fonte (GitHub): Este repositório contém o código-fonte completo e o histórico de commits.
-
Relatório (README.md): Este documento serve como o relatório de 3-5 páginas exigido.
-
Vídeo de Demonstração (YouTube): O vídeo de 3-5 minutos, que demonstra todo o fluxo da aplicação e a atualização do banco de dados, pode ser assistido no link abaixo:
-
Arquivo .jar e Javadoc: O arquivo
.jarexecutável e a pastajavadocgerada estão incluídos no arquivo.zipsubmetido na plataforma Moodle, conforme solicitado.
Para a construção deste projeto, foram utilizadas as seguintes tecnologias e padrões:
- Java (Swing): Para a criação de todas as interfaces gráficas (GUI).
- PostgreSQL: Como sistema gestor de banco de dados (SGBD).
- JDBC: Para fazer a conectividade entre a aplicação Java e o banco de dados.
- Padrão MVC (Model-View-Controller): Para a organização e arquitetura do código.
- NetBeans IDE: Como ambiente de desenvolvimento.
- Git & GitHub: Para controlo de versão e entrega.
O projeto (individual) cumpre todos os requisitos funcionais, incluindo as 4 operações do CRUD (Create, Read, Update, Delete) solicitadas pela professora:
-
1. Gestão de Usuário (CRUD - Create, Read):
- Cadastro de Novo Usuário: O utilizador pode criar uma nova conta (Nome, Email, Senha, CPF). O sistema valida campos vazios e duplicação de email/CPF.
- Login de Usuário: O sistema autentica o utilizador e cria uma sessão global (
SessaoUsuario).
-
2. Busca de Alimentos (CRUD - Read):
- Listagem Completa: Ao entrar na tela principal, todos os alimentos são carregados na tabela.
- Busca por Nome: O utilizador pode pesquisar alimentos por nome (ex: "Pizza").
- Filtro por Tipo: O utilizador pode filtrar os resultados por "Comida" ou "Bebida".
- Listar Informações: A tabela principal exibe todas as informações relevantes (Nome, Preço, Porção, Descrição, Avaliação).
-
3. Gestão do Carrinho (CRUD na Memória):
- Adicionar Itens: O utilizador pode selecionar um item da busca e adicioná-lo ao carrinho.
- Agrupamento de Itens: O carrinho (
Carrinho.java) agrupa itens iguais, incrementando a quantidade (ex: "Lasanha | Qtd: 3"). - Remover Itens: O utilizador pode remover uma unidade de um item do carrinho.
- Esvaziar Carrinho: O utilizador pode limpar todos os itens do carrinho de uma só vez (cumprindo a lógica de "excluir pedidos" do carrinho atual).
-
4. Finalização de Pedido (CRUD - Create):
- Criar Pedido: Ao "Finalizar Pedido", o sistema executa uma transação no
PedidoDAOque salva o "cabeçalho" na tabelapedidoe todos os itens (com quantidade) na tabelapedido_itens. - Proteção de Clique Duplo: O botão "Finalizar" é desabilitado no momento do clique para prevenir a criação de pedidos duplicados.
- Criar Pedido: Ao "Finalizar Pedido", o sistema executa uma transação no
-
5. Avaliação de Pedido (CRUD - Update):
- Avaliar Pedido: Imediatamente após finalizar, o utilizador é levado à tela de avaliação.
- Salvar Avaliação: O sistema faz um
UPDATEna tabelapedido, salvando anota_avaliacao(0-5 estrelas) e ocomentario_avaliacao.
-
6. Histórico de Pedidos (CRUD - Read, Delete):
- Ler Histórico: O utilizador pode abrir uma nova tela que faz um
SELECTno banco e exibe todos os seus pedidos antigos, ordenados por data. - Cancelar Pedido (Delete): O utilizador pode selecionar um pedido do histórico e "cancelá-lo". Esta ação executa uma transação de
DELETE(apagando primeiro depedido_itense depois depedido) para cumprir 100% o requisito "D" do CRUD.
- Ler Histórico: O utilizador pode abrir uma nova tela que faz um
Nota sobre o Escopo: As funcionalidades de administrador e estatísticas, solicitadas em projetos realizados em dupla, não foram implementadas nesta versão, que é um projeto individual.
O projeto foi estruturado para cumprir os principais critérios de avaliação:
- Conceitos de Orientação a Objetos: O projeto implementa Herança e Polimorfismo, conforme o diagrama de classes.
Alimentoé uma classeabstract, enquantoComidaeBebidaherdam dela. OAlimentoDAOatua como uma "Factory" que decide qual objeto criar. - Interface: A classe
Bebidaimplementa ainterface Imposto_Alcool, usando uma flagis_alcoolicodo banco de dados para calcular o imposto de forma limpa. - Padrão MVC: O código é estritamente separado nos pacotes
model,view,controlleredao, como ensinado noExemplo_BD.pdf. - Segurança (SQL Injection): Todas as consultas ao banco de dados, sem exceção (incluindo
INSERT,SELECT,UPDATEeDELETE), utilizamPreparedStatement(?) para prevenir ataques de SQL Injection.
Para executar este projeto, siga os passos:
-
Configuração do Banco de Dados:
- Certifique-se de que o PostgreSQL está instalado e em execução.
- No pgAdmin4, crie um novo banco de dados chamado
feifood_db. - Execute o script
database_script.sql(incluído no repositório) para criar todas as 5 tabelas. - Execute o script
PopulateEstabelecimentoAlimento.sql(incluído no repositório) para popular o banco com 10 estabelecimentos e 100 alimentos.
-
Configuração do Projeto (NetBeans):
- Abra o projeto no NetBeans.
- Adicione o arquivo
.jardo driver JDBC do PostgreSQL (postgresql-42.7.8.jar) às "Bibliotecas" do projeto. - !! IMPORTANTE !! Abra o arquivo
br.com.feifood.dao.Conexao.javae altere a senha na linhaConnection conexao = ...para a senha do seu superusuário "postgres".
-
Execução:
- Clique com o botão direito no projeto > "Propriedades" > "Executar".
- Defina a Classe Principal como
br.com.feifood.view.TelaLogin(ouview.Login). - Clique em "Limpar e Construir" (
Clean and Build). - O arquivo
FEIFood.jarfuncional estará na pastadist/. Execute-o (juntamente com a pastadist/lib).
/view: Contém todas as classesJFrame Form(telas)./model: Contém as classes "POJO" (Usuario,Estabelecimento,Alimento,Comida,Bebida,Pedido,Pedido_Itens) e a interface (Imposto_Alcool)./controller: Contém as classes de "cérebro" (ControleLogin,ControleCadastro,ControlePrincipal,ControlePedido,ControleAvaliacao,ControleHistorico)./dao: Contém as classes que executam SQL (Conexao,UsuarioDAO,AlimentoDAO,PedidoDAO)./utils: Contém classes de apoio globais (Carrinho,SessaoUsuario,FormatadorPreco).
Feito por EnricoNSilva.