Usaremos como projeto de exemplo o Caelum Eats: uma aplicação de entrega de comida nos moldes de soluções conhecidas no mercado.
Há 3 perfis de usuário:
- o cliente, que efetua um pedido.
- o dono do restaurante, que mantém os dados do restaurante e muda os status de pedidos pendentes.
- o administrador do Caelum Eats, que mantém os dados básicos do sistema e aprova novos restaurantes.
O intuito do cliente é efetuar um pedido, que é um processo de várias etapas. No Caelum Eats, o cliente não precisa fazer login.
Ao acessar a página principal do Caelum Eats, o cliente deve digitar o seu CEP.
Depois de digitado o CEP, o Caelum Eats retorna uma lista com os restaurantes mais próximos. Entre as informações mostradas em cada item da lista, está a distância do restaurante ao CEP.
O cliente pode filtrar por tipo de cozinha, se desejar. Então, deve escolher algum restaurante.
Os dados iniciais do Caelum Eats vêm apenas com um restaurante: o Long Fu, de comida chinesa.
Observação: a implementação não calcula de fato a distância do CEP aos restaurantes. O valor exibido é apenas um número randômico.
Depois de escolhido um restaurante, o cliente vê o cardápio.
Também são exibidas outras informações do restaurante, como a média das avaliações, a descrição, os tempos de espera mínimo e máximo e a distância do CEP digitado pelo cliente.
Há também uma aba de avaliações, em que o cliente pode ver as notas e comentários de pedidos anteriores.
Ao escolher um item do cardápio, o cliente deve escolher uma quantidade. É possível fazer observações de preparo.
A cada item do cardápio escolhido, o resumo do pedido é atualizado.
Ao clicar no botão "Fazer Pedido", o cliente deve digitar os seus dados pessoais (nome, CPF, email e telefone) e os dados de entrega (CEP, endereço e complemento).
Então, o cliente informa os dados de pagamento. Por enquanto, o Caelum Eats só aceita cartões.
No próximo passo, o cliente pode confirmar ou cancelar o pagamento criado no anteriormente.
Se o pagamento for confirmado, o pedido será realizado e aparecerá como pedido pendente no restaurante!
Então, o cliente pode acompanhar a situação de seu pedido. Para ver se houve alguma mudança, a página deve ser recarregada.
Quando o restaurante avisar o Caelum Eats que o pedido foi entregue, o cliente poderá deixar sua avaliação com comentários. A nota da avaliação influenciará na média do restaurante.
O dono de um restaurante deve efetuar o login para manipular as informações de seu restaurante.
As informações de login do restaurante pré-cadastrado, o Long Fu, são as seguintes:
- usuário:
longfu
- senha:
123456
Depois do login efetuado, o dono do restaurante terá acesso ao menu.
Uma das funcionalidades permite que o dono do restaurante atualize o cadastro, manipulando informações do restaurante como o nome, CPNJ, CEP, endereço, tipo de cozinha, taxa de entrega e tempos mínimo e máximo de entrega.
Além disso, o dono do restaurante pode escolher quais formas de pagamento são aceitas, o horário de funcionamento e cadastrar o cardápio do restaurante.
O dono do restaurante também pode acessar os pedidos pendentes, que ainda não foram entregues. Cada mudança na situação dos pedidos pode ser informada por meio dessa tela.
O dono de um novo restaurante, que ainda não faz parte do Caelum Eats, pode registrar-se clicando em "Cadastre seu Restaurante". Depois de cadastrar um usuário e a respectiva senha, poderá preencher as informações do novo restaurante.
O novo restaurante ainda não aparecerá para os usuários. É necessária a aprovação do restaurante pelo administrador do Caelum Eats.
O administrador do Caelum Eats só terá acesso às suas funcionalidades depois de efetuar o login.
Há um administrador pré-cadastrado, com as seguintes credenciais:
- usuário:
admin
- senha:
123456
Não há uma tela de cadastro de novos administradores. Por enquanto, isso deve ser efetuado diretamente no Banco de Dados. Esse cadastro é uma das funcionalidades pendentes!
Depois do login efetuado, o administrador verá o menu.
Somente o administrador, depois de logado, pode manter o cadastro dos tipos de cozinha disponíveis no Caelum Eats.
Outra funcionalidade disponível apenas do administrador é o cadastro das formas de pagamento que podem ser escolhidas no cadastro de restaurantes.
Também é tarefa do administrador do Caelum Eats revisar o cadastro de novos restaurantes e aprová-los.
O back-end do Caelum Eats provê uma API REST. A porta usada é a 8080
.
O Banco de Dados utilizado é o MySQL, na versão 5.7 e executado na porta 3307
.
É implementado com as seguintes tecnologias:
- Spring Boot
- Spring Boot Web
- Spring Boot Validation
- Spring Data JPA
- MySQL Connector/J
- Flyway DB, para migrations
- Lombok, para um Java menos verboso
- Spring Security
- jjwt, para gerar e validar tokens JWT
- Spring Boot Actuator
As migrations do Flyway DB, que ficam no diretório src/main/resources/db/migration
, além de criar a estrutura das tabelas, já popula o BD com dados iniciais.
O front-end do Caelum Eats é uma SPA (Single Page Application), implementada em Angular 7. A porta usada em desenvolvimento é a 4200
.
Para a folha de estilos, é utilizado o Bootstrap 4.
São utilizados alguns componentes open-source:
- ngx-toastr
- angular2-text-mask
- ng-bootstrap
- Clone o projeto do back-end para seu Desktop com os seguintes comandos:
cd ~/Desktop
git clone https://gitlab.com/aovs/projetos-cursos/fj33-eats-monolito.git
- O MySQL será executado pelo Docker Compose. Para isso, baixe e execute o
docker-compose.yml
para o seu Desktop com os seguintes comandos:
cd ~/Desktop/
curl https://gitlab.com/snippets/1954188/raw > docker-compose.yml
docker-compose up -d
- Abra o Eclipse, definindo como workspace
/home/<SEU-USUARIO>/workspace-monolito
. Troque<SEU-USUARIO>
pelo seu login. - No Eclipse, acesse File > Import > Existing Maven Projects e clique em Next. Em Root Directory, aponte para o diretório clonado anteriormente.
- Acesse a classe
EatsApplication
e a execute com CTRL+F11. O banco de dados será criado automaticamente e alguns dados serão populados. - Teste a URL
http://localhost:8080/restaurantes/1
pelo navegador e verifique se um JSON com os dados de um restaurante foi retornado. - Analise o código. Veja:
- as entidades de negócio
- os recursos e suas respectivas URIs
- os serviços e suas funcionalidades.
- Em um terminal, baixe para o Desktop o projeto do front-end, usando o Git, com os comandos:
cd ~/Desktop
git clone https://gitlab.com/aovs/projetos-cursos/fj33-eats-ui.git
- Na pasta do front-end do projeto, instale as dependências com o comando:
cd ~/Desktop/fj33-eats-ui
npm install
- Execute a aplicação com o comando:
ng serve
- Abra um navegador e teste a URL:
http://localhost:4200
. Explore o projeto, fazendo um pedido, confirmando um pedido efetuado, cadastrando um novo restaurante e aprovando-o. Em caso de dúvidas, peça ajuda ao instrutor.
No Caelum Eats, a entrega é por conta do restaurantes. Porém, está no road map do produto ter entregas por meio de terceiros, como motoboys, ou por funcionários do próprio Caelum Eats.
Atualmente, só são aceitos cartões de débito, crédito e vale refeição. Entre as ideias estão aceitar o pagamento em dinheiro e em formas de pagamentos inovadoras como criptomoedas, soluções de pagamento online como Google Pay e Apple Pay e pagamento com QR Code.
Entre especialistas de negócio, desenvolvedores e operações, a equipe passou a ter algumas dezenas de pessoas, o que complica incrivelmente a comunicação.
Os desenvolvedores passaram a reclamar do código, dizendo que é difícil de entender e encontrar onde devem ser implementadas manutenções, correções e novas funcionalidades.
Há ainda problemas de performance, especialmente no cálculo dos restaurantes mais próximos ao CEP informado por um cliente. Essa degradação da performance acaba afetando todas as outras partes da aplicação.
Será que esses problemas impedirão a Caelum Eats de expandir os negócios?