Escolar Documentos
Profissional Documentos
Cultura Documentos
Natal – RN
Dezembro de 2019
Miguel Silva da Rocha Junior
Natal – RN
Dezembro de 2019
Miguel Silva da Rocha Junior
Natal – RN
Dezembro de 2019
AGRADECIMENTOS
A minha família, por todo apoio e incentivo que me deram durante toda a minha
vida, incluindo a minha jornada acadêmica. Em especial aos meus pais que tanto me
incentivaram e ainda incentivam o meu crescimento profissional e pessoal. E mais ainda
por serem estes seres humanos tão verdadeiros e batalhadores que são. Sempre foram, são
e sempre serão um grande exemplo para mim.
Ao meu amor, Maria Clara, que tanto me apoia e me inspira pelo seu jeito batalhador
e decidido, o meu porto seguro. Obrigado por todas as horas que esteve me apoiando, pelo
companheirismo e paciência, compreensão e carinho. Sem você tudo isso teria sido muito
mais difícil.
Ao meu orientador Prof. Dr. Ivanovitch Dantas da Silva pela oportunidade de
trabalho, toda a orientação e estímulo que tornaram possível a realização deste trabalho.
Aos meus professores da graduação que me mostraram o valor da ciência e do
empreendedorismo para a sociedade em que vivemos. Aos professores Bruno Marques
Ferreira Da Silva e Luiz Marcos Garcia Gonçalves que orientaram por todo o meu período
como bolsista de iniciação científica. Aos professores Aquiles Burlamaqui, Luiz Eduardo
Cunha Leite, Júlio Melo, Agostinho de Medeiros Brito Junior, Marcelo Augusto Costa
Fernandes que tanto falavam e mostravam o impacto da ciência na sociedade através do
empreendedorismo, da geração de empregos.
Aos meus sócios e amigos Álvaro e Gabriel por todo o suporte, paciência, incentivo
e ajuda que recebi de vocês para este trabalho. O nosso dia-a-dia me faz crescer, buscar
sempre aquela melhoria a mais, buscar sempre crescer. Buscar sair da zona de conforto
porque não existe conforto na zona de crescimento.
A todos os demais que constroem a minha vida acadêmica: colegas, amigos, profes-
sores, funcionários da universidade e família. A todos vocês o meu obrigado.
“Everything you want is a dream away”
(Adventyre of a Lifetime - Coldplay)
RESUMO
Entregas à domicílio são uma tendência de mercado. De acordo com a McKinsey &
Company (uma das maiores empresas de consultorias do mundo), em 2020, 58% das
compras feitas neste mercado serão através da internet. E com este crescimento, vem
também a grande necessidade de soluções digitais para atender toda esta demanda. Uma
solução que vem se mostrado muito eficaz é a combinação de aplicativos para dispositivos
móveis, aplicações de PDV (Ponto De Venda) e uma aplicação Web para conecta-las.
Estas aplicações se comunicam através da API (Application Programmable Interface)
disponibilizada pela aplicação Web para realizar as transações necessárias à realização de
uma compra. Estas comunicações ocorrem de forma distribuída, com cada uma disponível
em uma diferente parte do globo. E a arquitetura de Representação de Transferência de
Estado (REST), introduzida no ano 2000 por Roy Thomas Fielding em sua dissertação
de doutorado, é uma ótima forma realizar estas conexões. Além disso, esta arquitetura
permite separamos o software em serviços com baixíssimo acoplamento, muitas vezes até
independentes. Como, por exemplo: serviços de notificações push, de caching, banco de
dados e armazenamento de arquivos estáticos. Desta forma, podendo até evoluir para um
sistema horizontalmente escalável.
1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1 Contextualização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.1 Objetivo geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.2 Objetivos específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3 Estrutura do Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2 REFERENCIAL TEÓRICO . . . . . . . . . . . . . . . . . . . . . . . 14
2.1 Banco de dados relacionais e não relacionais . . . . . . . . . . . . . . 14
2.1.1 Banco de dados relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.2 Banco de dados não relacionais . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.3 O banco de dados escolhido . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Protocolo HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4 Aplicativos móveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5 Desenvolvimento híbrido de aplicações móveis . . . . . . . . . . . . . 19
2.6 Trabalhos relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3 DESENVOLVIMENTO . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.1 Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.1.1 Contas: o módulo de autenticação . . . . . . . . . . . . . . . . . . . . . . 24
3.1.2 Catálogo: o módulo de vitrine . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.3 Entregas: o coração da aplicação . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.4 Pedidos: conectando todos os pontos . . . . . . . . . . . . . . . . . . . . 28
3.2 Construção da API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.1 Amazon AWS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.2 Django e Django REST Framework . . . . . . . . . . . . . . . . . . . . . 33
3.2.3 Django: Arquitetura MVC vs MTV . . . . . . . . . . . . . . . . . . . . . . 34
3.2.4 Django e sua ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.5 Serviços adicionais utilizados . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3 A aplicação móvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.1 React . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3.2 Estrutura de navegação . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.3.2.1 Store stack: a listagem de lojas . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3.2.2 Checkout stack: a realização do pedido . . . . . . . . . . . . . . . . . . . . . 43
3.3.2.3 Order Stack: o acompanhamento dos pedidos . . . . . . . . . . . . . . . . . 44
3.3.2.4 Profile Stack: os dados pessoais . . . . . . . . . . . . . . . . . . . . . . . . 46
4 RESULTADOS E DISCUSSÕES . . . . . . . . . . . . . . . . . . . . 48
4.1 Interfaces da aplicação móvel . . . . . . . . . . . . . . . . . . . . . . . 48
4.1.1 Store stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.1.2 Checkout Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.3 Order Stack: acompanhando os pedidos . . . . . . . . . . . . . . . . . . . 53
4.1.4 Profile Stack: os dados do pessoais . . . . . . . . . . . . . . . . . . . . . 56
5 CONCLUSÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.1 Dificuldades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2 Trabalhos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
12
1 INTRODUÇÃO
1.1 Contextualização
Segundo o Shopify, uma das maiores plataformas e e-commerce do mundo (STA-
TISTA, 2017), o comércio eletrônico, ou e-commerce, consiste na compra e venda de pro-
dutos, serviços e informações através da internet (SHOPIFY, 2019). O termo e-commerce
é comumente utilizado para se referir a venda de bens físicos online. Entretanto, o termo
também descreve qualquer tipo de transação comercial que é facilitada através da internet.
Enquanto o e-business (negócio eletrônico, em tradução livre) se refere a todos os aspec-
tos da operação de um negócio online, o comércio eletrônico se refere especificamente à
transação de bens e serviços.
Cada vez mais indivíduos e empresas estão eletronicamente conectados e isso vem
impulsionando e estimulando o crescimento do comércio eletrônico. Este é um mercado
que deve movimentar 6542 trilhões de dólares americanos em 2023 (CLEMENT, 2019).
Todo este comércio por meio da internet é, de forma geral, operacionalizado por
sistemas de comércio eletrônico. Estes sistemas são páginas na internet com um software
de gerenciamento ou aplicativos móveis. E este último tem crescido muito. Em 2017, 34.5%
das vendas do e-commerce mundial foram feitas em dispositivos móveis (MALI, 2019).
Juntamente com este crescimento, novos caminhos se abrem para o comércio
eletrônico. E um deles é o mercado de entregas rápidas. Este trabalho entende como
entregas rápidas uma compra de bens ou serviços físicos que devem ser entregues ou
prestados em um período curto, de menos de 24 horas. Este mercado vem crescendo,
principalmente no setor alimentício. Neste setor, os pedidos online devem chegar a 58% de
todas as compras feitas no ano de 2020 (HIRSCHBERG et al., 2016).
Estes dados mostram uma forte tendência: o crescimento das economias de conveni-
ência. Este trabalho entende como economia de conveniência todo o serviço e-commerce
cuja compra de bens ou serviços acontece através do delivery. Por esta tendência de
crescimento do mercado de delivery, do uso dos smartphones e do comércio online, este
trabalho foi proposto.
Capítulo 1. Introdução 13
1.2 Objetivos
1.2.1 Objetivo geral
O objetivo geral corresponde ao resultado principal da realização deste trabalho,
ou seja, o desenvolvimento de uma plataforma de e-commerce, da API à aplicação móvel,
com foco no modelo de delivery. Os objetivos específicos complementam o objetivo geral
em termos da finalidade do projeto.
• OS1- Modelar banco de dados para autenticação de usuários, compra, venda e entrega
de produtos;
• OS3- Projetar uma aplicação móvel funcional para que um consumidor possa realizar
uma compra;
• OS4- Fazer com que esta implementação seja utilizada por usuários;
2 REFERENCIAL TEÓRICO
Quantidade
ID do produto Nome Preço
em estoque
1 SKOL R$ 3,90 2
2 MERLOT R$ 29,90 1
3 CHOPE 20L R$ 330,00 5
Tabela 1 – Tabela de um banco de dados relacional
Fonte – Própria
As tabelas são conectadas para que os dados de uma tabela possam estar relacionados
a outros por meio de uma chave. Estas chaves pode ser de dois tipos: primária e estrangeira.
A chave primária é usada para identificar na tabela inteira, cada tupla, como única. No
exemplo da tabela 1, a chave primária é o ID do produto. A chave estrangeira é usada para
tabelas de referência cruzada. Por exemplo, a figura 1 no caso cada produto possua uma
ou mais variantes, e uma variante pertença apenas a um produto, temos uma tabela de
variante de produto com uma chave estrangeira referindo-se ao produto que dono daquela
variante. Chave estrangeira em uma tabela pode representar uma chave primária na outra
(DATE, 2015).
Capítulo 2. Referencial Teórico 15
1. Atomicidade: uma transação é uma unidade atômica: deve ser deve ser executado
na sua totalidade ou não ser executado.
3. Isolamento: Uma transação deve aparecer como se estivesse sendo executada isolada-
mente de outras transações, mesmo que muitas transações estejam sendo executadas
simultaneamente. Ou seja, a execução de uma transação não deve ser interferida por
outras transações executadas simultaneamente.
Capítulo 2. Referencial Teórico 16
1. GET : o método GET significa recuperar qualquer informação (na forma de uma
entidade) que é definida pela URI 1 (endereço de destino de navegação) da requisição.
Se a URI da requisição refere a um processo de produção de dados, é o dado produzido
que deve ser retornado como a entidade na resposta e não o texto fonte do processo.
A não ser que o texto seja o resultado final do processo;
3. POST : O método HTTP POST envia dados ao servidor, podendo acarretar a criação
de uma um novo recurso ou não. Uma solicitação POST geralmente é enviada por
meio de um formulário HTML e resulta em uma alteração no servidor. No caso desta
1
https://en.wikipedia.org/wiki/UniformR esourceI dentif ier
Capítulo 2. Referencial Teórico 18
2.3 REST
Representational State Trasnfer (REST) é uma arquitetura de software que define
um conjunto de regras para serem utilizadas na criação de um serviço Web (BOOTH et
al., 2019). Permite, também, que a aplicação cliente execute ações sobre recursos, tais
como: criar novos recursos (por exemplo, um novo produto) e atualizar recursos existentes
(por exemplo, atualizar o preço de um produto), por exemplo. Para que um API seja
considerada RESTful, ela precisa seguir um conjunto de regras quando escritas. Estas
regras fazem com que as APIs fiquem fáceis de usar e descobrir, ou seja, um desenvolvedor
que começou a utilizar a API há pouco tempo terá uma maior facilidade aprendendo
utiliza-la. A arquitetura REST possui como principais regras: o padrão cliente-servidor,
sem estado (stateless), cache, interface uniforme (FIELDING, 2000).
aplicação nativa para iOS seria escrita usando Swift 4 ou Objetctive-C (APPLE, 2014) e
compiladas usando Xcode (APPLE, 2019). Já no Android, uma aplicação nativa é escrita
usando Kotlin 5 , Java 6 ou C++ e compilada usando Android Studio. O segundo conceito
é o de a aplicação Web. São aplicações executadas em um navegador comum: seja ele móvel
ou não. Estas são aplicações tradicionais escritas em HTML, CSS e JavaScript.
Cada um destes conceitos gera uma tipo de desenvolvimento híbrido: híbrido-nativo
e híbrido-Web (KREMER, 2019). O primeiro é uma biblioteca que executa, normalmente
em JavaScript, em ambas as plataformas mas com chamadas que gerenciam uma interface
native de cada plataforma específica. Já o segundo é uma aplicação Web sendo executada
em um navegador nativo. Isto é, uma aplicação que pode ser executada em qualquer
navegador.
Em geral, devido a sua natureza de chamadas a funções nativas de interface, o
desenvolvimento híbrido-nativo possui uma melhor performance perante ao híbrido-Web
(SORAL, 2018). Por isto, foi escolhido para a implementação neste trabalho.
4
https://developer.apple.com/swift/
5
https://developer.android.com/kotlin
6
https://developer.android.com/guide/components/fundamentals?hl=en
7
https://magento.com/
8
https://www.mysql.com/
Capítulo 2. Referencial Teórico 21
cardápio, ou portfólio online. O trabalho não trata da ação de compra e venda direta,
embora seja facilitada pela exibição dos produtos do portfólio. As tecnologias utilizadas
foram: PHP, Dreamwaver e o banco de dados relacional MySQL.
Em (HOEFLING, 2015) , a autora descreve a implementação de e-commerce
denominado “Angel e Re acessórios”. Tem como objetivo um sistema para que o usuário
possa ver e comprar os produtos disponibilizados no sistema. Este é um sistema de e-
commerce para apenas um vendedor, o que não o caracteriza como um marketplace. As
tecnologias utilizadas foram: PHP, Dreamwaver e o banco de dados relacional MySQL.
Todos os trabalhos acima usam PHP como linguagem de programação, enquanto o
presente trabalho usa Python. Não foi encontrada uma implementação de um sistema de
e-commerce no formato de API para alimentar uma aplicação móvel. Entretanto, várias
soluções comerciais deste formato são encontradas.
9
https://ifood.com.br
10
https://rappi.com
11
https://ubereats.com
22
3 DESENVOLVIMENTO
1. Contas: chamado de accounts nesta aplicação, este é o módulo responsável por gerir
os tipos de usuários, a autenticação deles e o que mais referir-se apenas aos tipos
de usuários consumidor e loja. Alguns exemplos são: disponibilidade de lojas online,
redefinição de senhas e a autenticação por token. Neste módulo forma definidos
quatro modelos: usuário, loja, consumidor, horários de funcionamento e código de
redefinição de senha.
O autor informa exatamente onde o elemento gráfico deve ficar no texto, evitando
que quebras de páginas aconteçam no meio de um elemento. O problema com esta
abordagem é que todo o trabalho de posicionamento pode ser perdido caso se inclua
ou se exclua algum texto ou elemento.
as lojas que entregam no endereço fornecido. E, por final, qual o preço da entrega? Cada
zona de entrega possui um preço de entrega para o seu conjunto de bairros.
produto. Ou seja, no momento que o lojista alterar o preço dele, o preço do item do pedido
também irá mudar - o que não é um comportamento aceitável para um e-commerce. Esta
relação está descrita na imagem 8.
Esta mesma entidade deve estar presente no pedido, porque uma venda precisa de
uma forma de pagamento. Aqui, diferentemente do item do pedido, temos uma referência
Capítulo 3. Desenvolvimento 30
direta a tabela de formas de pagamento. O motivo é simples: como esta é uma tabela a
qual apenas a plataforma pode inserir dados, não há riscos de um usuário consumidor ou
loja alterar esta informação. Embora seja verdade que estes usuários possam alterar quais
formas de pagamento aceitam, entretanto, após a realização do pedido, a referência fica
registrada e nenhum desses usuários pode alterá-la. Este relacionamento é mostrado na
figura 10.
dos: latitude e longitude. Ambos eles são utilizados em um caso de uso bem específico:
navegação GPS do entregador. Isto é, ao invés de digitar o endereço e torcer para que o
forward geocoding (o ato de enviar um endereço digitado e retornar a latitude e longitude
aproximadas) possua uma boa precisão, a latitude e a longitude ficam disponíveis com os
valores fornecidos pelo consumidor. Isso acontece quando o usuário do tipo consumidor
cadastra um novo endereço. A aplicação cliente deve mostrar um mapa para que o usuário
selecione a latitude e a longitude exatas do endereço que está sendo cadastrado.
máquinas virtuais, serviços DNS, bancos de dados, envio de emails, envio de notificações e
vários outros. Este serviço é utilizado por grande parte das aplicações Web nos dias de
hoje. O relatório Custom Applications and IaaS Trends (MCAFEE; ALLIANCE, 2019),
mostra que 41.5% das aplicações implantadas através da internet utilizaram AWS. E este é
o primeiro motivo da opção por este serviço. Com muitas pessoas utilizando, a comunidade
online da AWS tornou-se muito grande. Isso facilita a busca por informações, tutoriais e
eventuais erros durante a implementação. Principalmente quando utilizando o seu produto
de computação elástica.
O Amazon EC2 2 (Elastic Cloud Computing), é um serviço Web que provém
computação em nuvem de forma segura e redimensionável. Ele foi projetado para tornar a
computação em nuvem em escala na Web mais fácil para os desenvolvedores. E realmente
tornou. Por isso, foi escolhido para este trabalho. Também é necessário citar o tipo da
instância escolhida. Para tomar esta decisão, precisa-se entender quais serão as necessidades
da aplicação. A possibilidade de escalabilidade horizontal é um requisito importante, embora
ainda não implementado neste trabalho. Para isso, o sistema foi dividido em três partes:
aplicação, serviço de caching e banco de dados.
Para o servidor de aplicação, é preciso um balanço entre poder de processamento e
disponibilidade de memória RAM. Então, de acordo com a documentação dos tipos de
instância fornecidos pelo EC2 (AMAZON, 2019a), a T2 medium preenche estes requisitos.
De acordo com o mesmo documento, este tipo é indicado para aplicações de propósito
geral. A tabela 2 sintetiza as especificações técnicas da instância.
T2 Medium
vCPU 2
Mem. (GiB) 4
Performance de rede Baixa a moderada.
Fonte – Amazon EC2 Instance Types - Amazon Web Services 2019
Os processadores deste tipo de instância possuem até 3.3 GHz Intel Scalable
Processor. O sistema operacional escolhido para ser instalado nesta instância foi o Ubuntu
Server 3 versão 18.04 LTS. A escolha se dá por dois motivos: gratuidade e grande comunidade
- o que facilita discutir erros e encontrar artigos descrevendo algum eventual processo de
instalação de dependências. E pela facilidade, claro, de conexão com outros seviços da
AWS como, por exemplo o de banco de dados.
O Amazon RDS Amazon Relational Database Service 4 , é o serviço de banco de
2
https://aws.amazon.com/ec2/
3
https://ubuntu.com/download/server
4
https://aws.amazon.com/rds/
Capítulo 3. Desenvolvimento 33
acesso e atualizações de modelos que vem completas com validações e segurança. Ela nos
permite escrever um código trivial que funciona com diferentes bancos de dados. Esta
funcionalidade da ORM alimenta grande parte do ecossistema dos pacotes de terceiros
desenvolvidos para o Django.
A ORM do Django, como qualquer ORM, converte dados de tipos diferentes em
objetos que podem ser usados de forma bem consistente através dos bancos de dados
suportados. Então ela fornece um conjunto de métodos para interagir com estes objetos.
No caso de uma busca no modelo de usuários (User) cujo tipo de conta é 0, a consulta fica
como na figura 13.
Esta abstração traz uma produtividade muito grande quando se está desenvolvendo
e temos, na maioria das vezes, consultas simples. Entretanto, a ORM também permite a
execução de um código SQL, diretamente no banco. Este último é útil para consultas mais
complexas, que envolvem operações de JOIN em tabelas, agrupamentos dentre outros.
10
https://aws.amazon.com/elasticache/?nc=sn&loc=0
11
https://aws.amazon.com/s3/
12
https://firebase.google.com/docs
13
https://aws.amazon.com/redis/
Capítulo 3. Desenvolvimento 36
14
https://firebase.google.com/docs/cloud-messaging/server#choosing-a-server-option
15
https://firebase.google.com/pricing
16
https://stackoverflow.com/questions/tagged/firebase
17
https://django-storages.readthedocs.io/en/latest/
18
https://boto3.amazonaws.com/v1/documentation/api/latest/index.html
Capítulo 3. Desenvolvimento 37
2. Tempo de desenvolvimento
3. Comunidade
4. Perfomance
19
https://aws.amazon.com/s3/pricing/
20
https://www.android.com/
21
https://developer.apple.com/ios/
22
https://ionicframework.com/
23
https://facebook.github.io/react-native/
24
https://developer.apple.com/swift/
25
https://developer.android.com/kotlin
Capítulo 3. Desenvolvimento 38
3.3.1 React
React.js 27 é uma biblioteca para a linguagem JavaScript usada para o desenvolvi-
mento de interfaces de usuário dinâmicas e aplicações Web. Atualmente é mantido pelo
Facebook e por uma vasta comunidade de desenvolvedores, além de ser amplamente usada
na indústria da tecnologia 28 .
Aplicações construídas com esta biblioteca são baseadas em componentes isolados e
reutilizáveis que, quando combinados, podem formar interfaces de usuário mais complexas.
26
Um componente de interface que executa uma tela de navegador em uma aplicação nativa
27
https://reactjs.org/
28
https://stackshare.io/react
Capítulo 3. Desenvolvimento 39
Todos os elementos que são renderizados na tela são componentes, tais como: botões,
campos de texto, listas, etc.
Esses componentes são classes ou funções escritas em JavaScript que contém tanto
o código necessário para sua renderização quanto a lógica usada para reagir a interações
do usuário e mostrar conteúdo dinamicamente.
Cada aplicação React tem pelo menos um componente, chamado de root compo-
nent, ou componente raiz, em tradução livre. Esse componente contém todos os outros
componentes como filhos, formando uma árvore cujo a profundidade aumenta com a
complexidade da aplicação e a quantidade de componentes necessários para formá-la.
Os componentes são criados de maneira declarativa, definindo-se como os mesmos
devem reagir a um conjunto de estados, alterado a forma como são renderizados a cada
mudança. Por isso a biblioteca se chama React (que pode ser traduzido como Reagir), pois
os elementos reagem a mudanças de estados.
Para unir a lógica de renderização aos componentes React, a biblioteca faz uso
de uma extensão de sintaxe do Javascript chamada JSX 29 . Com ela é possível usar tags
similares as utilizadas no HTML, porém denro do príprio código Javascript.
Os componentes React possuem, além disso, comportamentos e características que
devem ser mencionados. Aqui, entretanto, não será feita menção aos React Hooks 30 . Nesta
implementação, as seguintes definições foram utilizdas:
3. Filhos: são componentes React que são passados na forma de props para serem
renderizados dentro do contexto do componente pai. Por exemplo, campos de texto
em um formulário. Eles permitem que as aplicações crescam e se tornem cada vez
mais complexas utilizando pequenos componentes filhos;
29
https://reactjs.org/docs/introducing-jsx.html
30
https://reactjs.org/docs/hooks-intro.html
Capítulo 3. Desenvolvimento 40
4. Estado: variável de classe 31 que define os parâmetros que compõem o contexto atual
de um componente React. Por exemplo: o texto sendo digitado em um componente
de entrada. O estado é a forma que o componente guarda informação durante seu
ciclo vida. Sempre que o estado é alterado, o método render é chamado para que o
componente seja re renderizado na tela em resposta a essa mudança.
31
Com a introdução dos novos React Hooks, funções também possuem estados
32
https://reactnavigation.org/
Capítulo 3. Desenvolvimento 41
1. Store stack: pilha de navegação que contém as telas usadas para que o usuário
possa selecionar o seu endereço de entrega, selecionar a uma loja, ver o catálogo de
uma loja selecionada e adicionar um produto ao seu carrinho;
2. Checkout stack: pilha de navegação que contém as telas usadas para que o usuário
finalize a sua compra. Nesta pilha, temos as seguintes telas: carrinho e seleção de
método de pagamento;
3. Order Stack: nesta pilha de navegação estão as telas: pedidos ativos, histórico de
pedidos e detalhes do pedido;
4. Profile Stack: a última pilha de navegação contém as telas para que o usuário
edite suas informações pessoais, sugira um estabelecimento, demonstre interesse em
cadastrar-se como parceiro, mudança de senha e detalhes gerais da aplicação.
Esta é a primeira pilha de navegação que o usuário verá quando interagir com
esta aplicação de e-commerce para delivery. Neta pilha, as telas são componentes React
que foram separados em arquivos com os mesmos nomes dos components: StoreList.js,
StoreDetails.js, ProductDetails.js e AddressList.js. Esta estrutura é mostrada na figura 17.
Quando o componente StoreList é montado, o primeiro método chamado é a Função
de Ciclo de vida componentDidMount, executada automaticamente pelo React. Dentro
deste método, é chamado o método assíncrono _fetchDataAsync. Ele tem como objetivo
requisitar da API quais lojas entregam no endereço selecionado pelo usuário e atualizar o
estado do componente com esta lista. Por consequência, como mencionado na seção acima,
Capítulo 3. Desenvolvimento 42
A primeira tela desta pilha a ser mostrada ao usuário é a tela Cart, cujo arquivo
de extensão JS possui o mesmo nome. Quando este componente React é montado o
primeiro método chamado é a Função de Ciclo de vida componentDidMount, executada
automaticamente pelo React. Dentro deste método, duas ações ocorrem: o componente
passa a ser ouvinte de um evento, e chama o método _componentDidFocus quando ele
ocorre, e o método assíncrono _validateCart é chamado.
O evento a qual o componente é assinalado como ouvinte é o didFocus (focou, em
tradução livre). Este é o evento de quando a tela está em foco, isto é, é a tela que está
sendo mostrada ao usuário naquele momento. O método _componentDidFocus implemen-
tado neste trabalho tem uma única função: chamar o método assíncrono _validateCart,
responsável por fazer uma requisição HTTP POST, com o seu corpo em formato JSON,
com o atual estado do carrinho para a API. Ou seja, toda vez que o usuário coloca a tela
Cart em foco, o método _validateCart é invocado.
Este é o método responsável por validar o carrinho do usuário. Nesta implementação,
uma escolha foi tomada para melhorar a experiência do usuário: o carrinho não é persistido
na API. Isto é, o carrinho é uma entidade efêmera, em memória, na aplicação cliente. O
motivo desta decisão é simples: evitar a necessidade de fazer chamadas à API todas as
vezes que carrinho sofresse qualquer alteração. Ou seja, toda vez que o usuário necessitasse
alterar uma quantidade de um produto, uma nova requisição deveria ser feita, deixando
cada iteração do usuário cada vez mais lenta. E, ao invés disso, a validação do carrinho é
chamada quando a tela está em foco. A validação do carrinho checa as seguintes regras de
negócio:
Capítulo 3. Desenvolvimento 44
2. Preço das variantes de produto: checa se o preço das variantes de produto que
o usuário possui no carrinho em memória é o mesmo que está na API;
Com estas regras de negócio satisfeitas, o usuário pode, enfim, finalizar o seu
pedido. Ainda na tela Cart, o usuário pressiona um botão que invoca a função assíncrona
_placeOrder. Esta função faz uma requisição HTTP POST para a API, com o seu corpo em
formato JSON, com as informações do carrinho. A API valida as informações novamente,
com as mesmas regras de negócio da validação do carrinho, e responde com um código
HTTP 201, caso o pedido tenha sido criado, ou um código HTTP 400 caso alguma validação
tenha falhado. Em caso de erro, o usuário recebe um alerta com as mensagens de erro das
validações e em caso de sucesso, o usuário é redirecionado para página de pedidos ativos,
na Order Stack (pilha de pedidos, em tradução livre).
Após o usuário realizar o pedido, a aplicação navega até a pilha de pedidos. Nesta
pilha, as telas são componentes React que foram separados em arquivos com os mesmos
nomes dos components: ActiveOrders.js, OrderHistory.js e OrderDetails.js, como mostrados
na figura 19.
Nesta pilha, a primeira tela a ser mostrada é a ActiveOrders, cujo arquivo de extensão
JS possui o mesmo nome. Quando este componente React é montado o primeiro método
chamado é a Função de Ciclo de vida componentDidMount, executada automaticamente
Capítulo 3. Desenvolvimento 45
pelo React. Dentro dele, o método assíncrono _fetchDataAsync é chamado com o objetivo
de requisitar os pedidos ativos do usuário autenticado. Como mencionado na seção 3.1.4,
cada pedido possui um status do tipo inteiro. Nesta implementação, cada pedido tem os
seguintes estados:
4. Saiu para Entrega: quando um pedido que foi confirmado pelo lojista é despachado
por ele para que seja entregue ao usuário;
6. Pedido cancelado: quando um pedido não pôde ser finalizado por algum motivo.
Por exemplo: falta de estoque, indisponibilidade do motoqueiro, recusa de recebimento
por parte do cliente, fim do horário de entrega, dentre outros.
Entende-se como pedido ativo, qualquer pedido que tenha um status diferente de
5 ou 4 (Pedido cancelado, ou Pedido finalizado, respectivamente. E são estes os pedidos
retornados pela API, em formato JSON, na chamada do método _fetchDataAsync. Este
mesmo método é responsável por atualizar o estado do componente com a lista retornada
pelo servidor. Nest momento, o React invoca o método render. Por consequência, como
mencionado na seção acima, a função render deste componente é chamada e as informações
são mostradas ao usuário no formato de uma interface amigável a seres humanos.
Ainda nesta pilha de navegação, o usuário autenticado pode escolher ver o seu
hatórico de pedidos. Quando realizada tal ação, a aplicação navega até a tela OrderHistory
cujo arquivo de extensão JS possui o mesmo nome. Quando este componente React é
montado o primeiro método chamado é a Função de Ciclo de vida componentDidMount,
executada automaticamente pelo React. Dentro dele, o método assíncrono _fetchDataAsync
é chamado com o objetivo de requisitar à API, através de uma requisição HTTP GET,
os dados dos pedidos finalizados ou cancelados, isto é, pedidos cujo status sejam 5 ou
4. Ao receber os dados, em formato JSON, o componente atualiza o seu estado com as
informações recebidas. Por consequência, como mencionado na seção acima, a função
Capítulo 3. Desenvolvimento 46
Cada usuário cadastrado possui suas informações pessoais, tais como: e-mail, nome,
telefone, CPF, data de nascimento e senha. E o usuário tem a opção de editar toda
estas informações com exceção da data de nascimento e o CPF. Estas informações são
apresentadas nesta pilha. As telas são componentes React que foram separados em arquivos
com os mesmos nomes dos componentes: Profile.js, EditProfile.js e ChangePassword.js,
como mostrados na figura 32.
Nesta pilha, a primeira tela a ser mostrada é a Profile, cujo arquivo de extensão
JS possui o mesmo nome. Antes deste componente React ser montado, as informações do
usuário são resgatadas através do mapeamento dos estados da aplicação para props do
componente. Quando ele inicia a montagem, a função render é chamada e estes dados são
mostrados ao usuário no formato de uma interface amigável a seres humanos. O usuário
tem duas opções: editar seus dados pessoais ou trocar a sua senha.
Capítulo 3. Desenvolvimento 47
Quando escolhe editar os seus dados, a aplicação navega até a tela EditProfile. Nela,
antes deste componente React ser montado, as informações do usuário são resgatadas
através do mapeamento dos estados da aplicação para props do componente. Para, assim,
serem mostradas ao usuário como um formulário pré-preenchido. Qualquer mudança
feita pelo usuário, requer que ele confirme-as apertando um botão. Com isso, o método
_patchUserInfo é chamado e uma requisição HTTP PATCH é feita para a API contendo
como corpo, em formato JSON, apenas os campos alterados pelo usuário.
Quando o usuário escolhe mudar a sua senha, a aplicação navega até a tela Change-
Password. Nela, quando o componente é montado, o seu estado inicial é definido na tabela
3.
Estado Valor
ActualPassword null
NewPassword null
ConfirmNewPassword null
Fonte – Própria
Os valores são iniciados como null, isto é, nulos, pois devem ser preenchidos pelo
usuário. O componente pai ChangePassword é um formulário de mudança de senha com três
entradas: a senha atual, a nova senha e a confirmação da nova senha. Cada entrada é um
componente React filho. Como são componentes com apenas 1 grau de profundidade, seus
estados são salvos no componente pai, o ChangePassword. Cada um dos componentes filhos
recebem como props o valor inicial definido na tabela 3: ActualPassword, NewPassword,
ConfirmNewPassword, respectivamente. Quando o usuário preenche todos os campos e
confirma a edição, o método assíncrono _updateUserPassword é chamado. Este método
faz uma requisição HTTP POST para a API. Caso as informações estejam corretas, o
senha do usuário autenticado é atualizada e uma resposta HTTP 200 é fornecida pela API.
Caso algum erro de validação ocorra, a API retorna um HTTP 400 detalhando os erros no
formato JSON.
48
4 RESULTADOS E DISCUSSÕES
Como citado na 3.3.2, este componente pai possui quatro componentes filhos. Cada
1
https://www.apple.com/iphone/
Capítulo 4. Resultados e Discussões 49
Númeração Tela
1 StoreList.js
2 StoreDetails.js
3 ProductDetails.js
4 AddressList.js
Fonte – Própria
Como também descrito na seção 3.3.2.1, há dois casos de uso para as telas desta
pilha de navegação: seleção de endereço e adição de um produto no carrinho. O caso de
uso de seleção de endereço é representado, sequencialmente, na figura 24. Já a adição dos
produtos no carrinho é representado, sequencialmente, na figura 25. As ações tomadas pelo
Capítulo 4. Resultados e Discussões 50
usuário em cada tela são destacadas por um quadrado vermelho. A sequência de ações é
enumerada no topo de cada tela.
A figura 24 mostra dois passos que o usuário necessita fazer ao selecionar o seu
endereço Primeiro, o usuário deve tocar em algum ponto da barra de endereço. Assim,
a aplicação irá navegar para a tela AddressList.js. Quando a tela, que é um componente
React, é montada, a requisição dos endereços do usuário autenticado é feita para o servidor,
através de uma requisição HTTP GET. Quando a tela recebe a resposta, atualiza o estado
do componente, fazendo com que o método render seja chamado e a lista de usuários
seja renderizada, como mostra a figura 24. Ao selecionar um dos endereços, uma função
de Callback, passada pelo componente anterior (a tela StoreList.js) através de props, é
chamada para atualizar o estado do componente pai. Assim, após a escolha do endereço, o
usuário é navegado de volta para a tela inicial.
A figura 25 demonstra o caso de uso em que o usuário adiciona um produto ao
carrinho. Inicialmente, o usuário é apresentado a tela de StoreList, mostrando todas as lojas
que entregam no endereço selecionado pelo usuário no caso de uso anterior. Primeiro, neste
exemplo, o usuário toca na loja "DrinkApp (Loja Teste)", ação que faz a aplicação navegar
até a página StoreDetails, passando como props o identificador da loja selecionada pelo
usuário. Quando chega no passo 2, a tela requisita da API os produtos da loja escolhida e
renderiza a resposta para o usuário, como mostra o passo 2 da figura 25. Neste exemplo, o
usuário toca no produto "SKOL BEATS SENSE", ação que faz a aplicação navegar até a
Capítulo 4. Resultados e Discussões 51
Númeração Tela
1 Cart.js
2 SelectPaymentMethod.js
Fonte – Própria
mencionado na seção 3.3.2.1, a primeira tela a ser mostrado ao usuário é a tela Cart.js.
Quando esta tela entra em foco, uma requisição HTTP POST é feita para a API para
validar as informações do carrinho, como descrito na seção 3.3.2.1. Com o carrinho validado,
o usuário necessita tomar mais duas ações obrigatórias: escolher a forma de pagamento e
finalizar o pedido.
No estado atual, para finalizar o pedido, o é necessário que o usuário forneça a
forma de pagamento. Para isso,o usuário seleciona a opção "Escolher"na tela Cart.js,
destacada com um quadrado vermelho. Esta ação faz a aplicação navegar para a tela
SelectPaymentMethod.js, passando como props o identificador da loja escolhida pelo usuário
para realizar o seu pedido e uma função de Callback, utilizada para atualizar o estado do
componente Cart.js com a forma de pagamento escolhida. Quando montada, a tela de
seleção de pagamentos requisita à API quais os métodos de pagamento aceitos pela loja
selecionada pelo usuário, através de uma requisição HTTP GET. A resposta, em formato
JSON, é uma lista de todos os métodos de pagamento aceitos pela loja. Então, o usuário
seleciona o meio de pagamento que lhe for mais conveniente. Esta ação invoca a função de
Callback passada via props, mencionada anteriormente, fazendo com que o estado da tela
anterior seja atualizado com a forma de pagamento escolhida e a aplicação navegue de
volta para tela anterior.
Por fim, após a seleção do método de pagamento, o usuário tem preenchido todos
os campos obrigatórios para a realização do pedido. Opcionalmente, ele também pode
escolher por adicionar o CPF, para que o lojista emita uma nota fiscal com esta informação.
Caso escolha fornecer este dado ou não, o usuário pode deslizar a tela e tocar no botão de
título "FINALIZAR PEDIDO", como mostrado na figura 27.
Neste momento, a aplicação faz uma requisição HTTP POST para a API para
criar o novo pedido. Aqui, a API refaz todas as validações do carrinho descritas na seção
3.3.2.2. Em caso de falha, recebe um HTTP 400 com as mensagens de erro. Em caso
de sucesso, recebe um código HTTP 201 - significando a criação do pedido. Ainda no
caso de sucesso, o componente Cart.js atualiza o seu estado em nível de componente.
O estado showSuccessModal é assinalado como verdadeiro, o método render é invocado
automaticamente pela biblioteca e uma mensagem de sucesso é mostrada para o usuário.
Dentro dela, o usuário tem a opção de acompanhar o seu pedido recém criado. Ao tocar
no botão "Ver pedido", como mostrado na figura 27, a aplicação navega para uma pilha de
navegação: Order Stack.
Númeração Tela
1 ActiveOrders.js
2 OrderHistory.js
3 OrderDetails.js
Fonte – Própria
Quando o usuário é navegado para esta pilha de navegação, a primeira tela mostrada
é a ActiveOrders. Quando montado, este componente React faz uma requisição HTTP GET
à API para receber os pedidos das últimas 24h realizados pelo usuário autenticado. Quando
a tela recebe a resposta, uma lista em formato JSON, atualiza o etado do componente,
fazendo com que o método render seja chamado e a lista de pedidos seja renderizada,
como mostra a tela 1 da figura 28.
Como mencionado, na seção 3.3.2.3, cada pedido possui um estado. Nesta implemen-
tação, não foi feita uma interface para o estado número 2 (pagamento pendente) porque a
Capítulo 4. Resultados e Discussões 55
funcionalidade de pagamento online não foi implementada, será uma função futura. Entre-
tanto, todos os estados são mostrados na figuras 30 e 29. A figura 30 mostra os pedidos
nos estados de: aguardando confirmação, confirmado e saiu para entrega, respectivamente.
Já a figura 30 mostra a interface dos pedidos já finalizados ou cancelados, isto é, com
estados 6 e 5, respectivamente.
Númeração Tela
1 Profile.js
2 EditProfile.js
3 ChangePassword.js
Fonte – Própria
5 CONCLUSÃO
1
https://www.apple.com/ios/app-store/
2
https://play.google.com/
Capítulo 5. Conclusão 61
5.1 Dificuldades
Para operacionalizar esta implementação, uma grande dificuldade foi conseguir uma
fonte fidedigna de códigos postais válidos. Devido a grande quantidade de cidades e bairros
com nomes repetidos, além da constante mudança dos números de CEP, a operacionalização
desta implementação sofreu algumas inconsistências, pois é completamente dependente de
uma base de códigos postais fidedigna. Uma solução para este problema é passara a utilizar
a localização geográfica como forma de determinação dos bairros, usando a abordagens de
polígonos para definir os bairros e estruturas como o GeoJSON para representa-los 3 .
b) Parar de utilizar o CEP como forma de definição de bairros e passar a utilizar uma
abordagem de localização, utilizando uma estrutura como GeoJSON;
3
https://geojson.org/
62
REFERÊNCIAS
AMAZON. Amazon EC2 Instance Types - Amazon Web Services. 2019. Acessado em 12 de
Novembro de 2019. Disponível em: <https://aws.amazon.com/ec2/instance-types/>. 32
AMAZON. Amazon RDS. 2019. Acessado em 16 de Novembro de 2019. Disponível
em: <https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora-
.Integrating.AutoScaling.html>. 34
APPLE. Programming with Objective-C. 2014. Acessado em 14 de novembro de
2019. Disponível em: <https://developer.apple.com/library/archive/documentation-
/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html>.
20
APPLE. Start Developing iOS Apps (Swift). 2019. Acessado em 12 de novembro de
2019. Disponível em: <https://developer.apple.com/library/archive/referencelibrary-
/GettingStarted/DevelopiOSAppsSwift/>. 20
BELLONI, L. Como o iFood se tornou o maior aplicativo de delivery de comida
da América Latina. 2018. Acessado em 30 de agosto de 2019. Disponível em:
<https://www.huffpostbrasil.com/2018/04/18/como-o-ifood-se-tornou-o-maior-
aplicativo-de-delivery-de-comida-da-america-latina a 23414651/>. 21
BOOTH, D. et al. Web Services Architecture. 2019. Acessado em 09 de Novembro de 2019.
Disponível em: <https://www.w3.org/TR/ws-arch/>. 18
BRANGER, F. Transformação de um site de e-commerce em um e-marketplace.
FAMÍLIA FIGUEIREDO FESTAS PORTFÓLIO DIGITAL, 2015. Disponível em:
<https://www.unifacvest.net/assets/uploads/files/arquivos/3f2cb-branger,-f.-familia-
figueiredo-festas-portifolio-digital.-unifacvest,-2013..pdf>. 20
CLEMENT, J. Retail e-commerce sales worldwide from 2014 to 2023 (in billion
U.S. dollars). Statista, 2019. Acessado em 14 de novembro de 2019. Disponível em:
<https://www.statista.com/statistics/379046/worldwide-retail-e-commerce-sales/>. 12
DATE, C. J. Sql and relational theory - how to write accurate sql code. In: SQL and
Relational Theory. [S.l.]: O’Rilley Media, 2015. p. 81–102. ISBN 978-1-491-94117-1. 14
DJANGO. Django appears to be a MVC framework, but you call the Controller the
View, and the View the Template. How come you don’t use the standard names? 2019.
Acessado em 12 de Outubro de 2019. Disponível em: <https://docs.djangoproject.com/en-
/2.2/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-
the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names>.
34
DUSSEAULT, L.; SNELL, J. PATCH Method for HTTP. 2010. Acessado em 02 de
novembro de 2019. Disponível em: <https://tools.ietf.org/html/rfc5789>. 17
ELMASRI, R.; NAVATHE, S. B. Fundamentals of database systems. In: Fundamentals of
Database Systems. [S.l.]: Pearson, 2015. p. 745–780. ISBN 978-0-13-397077-7. 15
Referências 63
GASIMOV, A. et al. Visiting mobile application development: What, how and where.
2010 Ninth International Conference on Mobile Business and 2010 Ninth Global Mobility
Roundtable (ICMB-GMR), IEEE, 2010. ISSN 0967-0661. 19
HIRSCHBERG, C. et al. The changing market for food delivery. 2016. Acessado em 10
de Junho de 2019. Disponível em: <https://www.mckinsey.com/industries/technology-
media-and-telecommunications/our-insights/the-changing-market-for-food-delivery>.
12
HUYNH, M. et al. Hybrid app approach: Could it mark the end of native app domination?
Informing Science Institute, 2017. Disponível em: <http://iisit.org/Vol14/IISITv14p049-
065Huynh3472.pdf>. 19
MACHADO, F. N. R.; ABREU, M. P. de. Projeto de banco de dados - uma visão prática.
In: Projeto de banco de dados. [S.l.]: Érica, 2012. p. 115–178. ISBN 978-8536502526. 15
UBER. When and where is Uber Eats available? 2019. Acessado em 22 de novembro de
2019. Disponível em: <https://help.uber.com/ubereats/article/when-and-where-is-uber-
eats-available-\?nodeId=3f8de61e-09dd-4844-afb2-749c9ffc65a8>. 21
Referências 65
ZIMER, B.; BARRETT, G.; METCALF, A. “app” 2010 word of the year, as voted
by american dialect society. American Dialect Society, American Dialect Society, 2011.
Disponível em: <https://www.americandialect.org/app-voted-2010-word-of-the-year-by-
the-american-dialect-society-updated>. 19