Resultado do Projeto
A partir dessa conversa, o aluno consegue extrair:
Banco de Dados Simplificado
- Tabela produtos
- id (PK)
- nome
- preco
- tamanho
- foto
- ativo (booleano)
- Tabela adicionais
- id (PK)
- nome
- preco
- Tabela pedidos
- id (PK)
- nome_cliente
- telefone_cliente
- bairro
- data_hora
- Tabela itens_pedido
- id (PK)
- pedido_id (FK)
- produto_id (FK)
- tamanho
- adicionais (lista simplificada, se quiser)
Casos de Uso
- Cliente:
- Visualizar produtos
- Adicionar produtos ao carrinho
- Escolher adicionais
- Finalizar pedido
- Dono da loja:
- Cadastrar produto
- Editar produto
- Cadastrar adicionais
- Desativar produto
- Ver pedidos
Objetivo Final
🎯 Criar um site com:
- Página inicial listando os produtos
- Tela de escolha de adicionais
- Carrinho de compras
- Formulário simples (Nome, Telefone, Bairro)
- Botão “Enviar pedido” integrando com WhatsApp
- Painel administrativo bem simples
Vou seguir essa ordem para ficar fácil para seus alunos:
- 🎯 Casos de Uso
- 📦 Diagrama de Classes
- 🛢️ Tabelas (Banco de Dados)
- 🖥️ Programa em Python (bem simples, tipo console) para atender o cliente
Vou fazer tudo bem simples e didático para quem está começando! Vamos lá:
🎯 1. Casos de Uso
Ator 1: Cliente
- Visualizar lista de produtos
- Escolher produto e adicionais
- Preencher nome, telefone e bairro
- Confirmar pedido
Ator 2: Dono da loja
- Cadastrar novo produto
- Editar produto
- Desativar produto
- Cadastrar adicionais
- Visualizar pedidos recebidos
📦 2. Diagrama de Classes (Simplificado)
+----------------+ +----------------+ +----------------+
| Produto | | Adicional | | Pedido |
+----------------+ +----------------+ +----------------+
| - id: int | | - id: int | | - id: int |
| - nome: str | | - nome: str | | - nome_cliente |
| - preco: float | | - preco: float | | - telefone |
| - tamanho: str | +----------------+ | - bairro |
| - ativo: bool | | - data_hora |
+----------------+ +----------------+
| |
| |
| +------------------------+
| |
| +-----------------+
| | ItensPedido |
| +-----------------+
| | - id: int |
+---------------->| - pedido_id: int |
| - produto_id: int|
| - adicionais: str|
+-----------------+
🛢️ Tabelas no SQLite
Aqui está o script para criar o banco SQLite:
-- Criação das tabelas no SQLite
CREATE TABLE produtos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
preco REAL NOT NULL,
tamanho TEXT NOT NULL,
ativo INTEGER DEFAULT 1 -- 1 = ativo, 0 = inativo
);
CREATE TABLE adicionais (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
preco REAL NOT NULL
);
CREATE TABLE pedidos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome_cliente TEXT NOT NULL,
telefone_cliente TEXT NOT NULL,
bairro TEXT,
data_hora TEXT DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE itens_pedido (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pedido_id INTEGER,
produto_id INTEGER,
adicionais TEXT,
FOREIGN KEY (pedido_id) REFERENCES pedidos(id),
FOREIGN KEY (produto_id) REFERENCES produtos(id)
);
🐍 Código Python usando SQLite (bem fácil)
Aqui está o programa completo agora com banco SQLite:
import sqlite3
from datetime import datetime
# Conexão com o banco SQLite
conn = sqlite3.connect('acai.db')
cursor = conn.cursor()
# Cria tabelas se não existirem
cursor.execute('''
CREATE TABLE IF NOT EXISTS produtos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
preco REAL NOT NULL,
tamanho TEXT NOT NULL,
ativo INTEGER DEFAULT 1
)
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS adicionais (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
preco REAL NOT NULL
)
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS pedidos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome_cliente TEXT NOT NULL,
telefone_cliente TEXT NOT NULL,
bairro TEXT,
data_hora TEXT DEFAULT CURRENT_TIMESTAMP
)
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS itens_pedido (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pedido_id INTEGER,
produto_id INTEGER,
adicionais TEXT,
FOREIGN KEY (pedido_id) REFERENCES pedidos(id),
FOREIGN KEY (produto_id) REFERENCES produtos(id)
)
''')
conn.commit()
def cadastrar_produto():
nome = input("Nome do produto: ")
preco = float(input("Preço: "))
tamanho = input("Tamanho (ex: 300ml, 500ml): ")
cursor.execute("INSERT INTO produtos (nome, preco, tamanho) VALUES (?, ?, ?)", (nome, preco, tamanho))
conn.commit()
print("Produto cadastrado!\n")
def cadastrar_adicional():
nome = input("Nome do adicional: ")
preco = float(input("Preço do adicional: "))
cursor.execute("INSERT INTO adicionais (nome, preco) VALUES (?, ?)", (nome, preco))
conn.commit()
print("Adicional cadastrado!\n")
def listar_produtos():
cursor.execute("SELECT id, nome, preco, tamanho FROM produtos WHERE ativo = 1")
produtos = cursor.fetchall()
print("\nProdutos disponíveis:")
for prod in produtos:
print(f"{prod[0]}. {prod[1]} - {prod[3]} - R$ {prod[2]:.2f}")
print()
def listar_adicionais():
cursor.execute("SELECT id, nome, preco FROM adicionais")
adicionais = cursor.fetchall()
print("\nAdicionais disponíveis:")
for ad in adicionais:
print(f"{ad[0]}. {ad[1]} - R$ {ad[2]:.2f}")
print()
def fazer_pedido():
listar_produtos()
produto_id = input("Escolha o número do produto: ")
cursor.execute("SELECT nome, tamanho FROM produtos WHERE id = ? AND ativo = 1", (produto_id,))
produto = cursor.fetchone()
if not produto:
print("Produto inválido!")
return
adicionais_selecionados = []
while True:
listar_adicionais()
add = input("Escolha o número do adicional (ou ENTER para finalizar): ")
if add == "":
break
cursor.execute("SELECT nome FROM adicionais WHERE id = ?", (add,))
adicional = cursor.fetchone()
if adicional:
adicionais_selecionados.append(adicional[0])
nome_cliente = input("Nome do cliente: ")
telefone = input("Telefone do cliente: ")
bairro = input("Bairro do cliente: ")
cursor.execute("INSERT INTO pedidos (nome_cliente, telefone_cliente, bairro) VALUES (?, ?, ?)",
(nome_cliente, telefone, bairro))
pedido_id = cursor.lastrowid
adicionais_texto = ', '.join(adicionais_selecionados)
cursor.execute("INSERT INTO itens_pedido (pedido_id, produto_id, adicionais) VALUES (?, ?, ?)",
(pedido_id, produto_id, adicionais_texto))
conn.commit()
print("Pedido registrado com sucesso!\n")
def listar_pedidos():
cursor.execute('''
SELECT pedidos.nome_cliente, pedidos.telefone_cliente, pedidos.bairro, pedidos.data_hora,
produtos.nome, produtos.tamanho, itens_pedido.adicionais
FROM pedidos
JOIN itens_pedido ON pedidos.id = itens_pedido.pedido_id
JOIN produtos ON produtos.id = itens_pedido.produto_id
''')
pedidos = cursor.fetchall()
print("\nPedidos recebidos:")
for ped in pedidos:
print(f"- {ped[0]} ({ped[1]}) pediu {ped[4]} {ped[5]} com {ped[6]} [{ped[3]}] - Bairro: {ped[2]}")
print()
def menu_admin():
while True:
print("\n=== Menu Admin ===")
print("1. Cadastrar Produto")
print("2. Cadastrar Adicional")
print("3. Listar Pedidos")
print("4. Sair")
op = input("Escolha: ")
if op == "1":
cadastrar_produto()
elif op == "2":
cadastrar_adicional()
elif op == "3":
listar_pedidos()
elif op == "4":
break
else:
print("Opção inválida.")
def menu_cliente():
while True:
print("\n=== Menu Cliente ===")
print("1. Fazer Pedido")
print("2. Sair")
op = input("Escolha: ")
if op == "1":
fazer_pedido()
elif op == "2":
break
else:
print("Opção inválida.")
def main():
while True:
print("\n=== Sistema Açaí ===")
print("1. Cliente")
print("2. Admin")
print("3. Sair")
op = input("Escolha: ")
if op == "1":
menu_cliente()
elif op == "2":
menu_admin()
elif op == "3":
print("Até mais!")
break
else:
print("Opção inválida.")
if __name__ == "__main__":
main()
🧡 O que você tem agora:
- Casos de uso ✅
- Diagrama de classes ✅
- Estrutura de tabelas SQL ✅
- Programa Python inicial ✅
Vou montar agora um exemplo usando Streamlit, que é perfeito para criar interfaces web simples em Python — ideal pra mostrar pra turma!
💡 O que vamos fazer:
- Listar produtos
- Cliente escolher o produto
- Selecionar adicionais
- Preencher nome, telefone e bairro
- Confirmar o pedido
- Mostrar o pedido feito na tela (como simulação)
Tudo direto pelo navegador, usando o acai.db
(SQLite)!
🖥️ Código Streamlit (arquivo app.py
)
import streamlit as st
import sqlite3
from datetime import datetime
# Conexão com o banco SQLite
conn = sqlite3.connect('acai.db', check_same_thread=False)
cursor = conn.cursor()
# Funções auxiliares
def listar_produtos():
cursor.execute("SELECT id, nome, preco, tamanho FROM produtos WHERE ativo = 1")
return cursor.fetchall()
def listar_adicionais():
cursor.execute("SELECT id, nome, preco FROM adicionais")
return cursor.fetchall()
def registrar_pedido(nome_cliente, telefone, bairro, produto_id, adicionais_lista):
cursor.execute("INSERT INTO pedidos (nome_cliente, telefone_cliente, bairro) VALUES (?, ?, ?)",
(nome_cliente, telefone, bairro))
pedido_id = cursor.lastrowid
adicionais_texto = ', '.join(adicionais_lista)
cursor.execute("INSERT INTO itens_pedido (pedido_id, produto_id, adicionais) VALUES (?, ?, ?)",
(pedido_id, produto_id, adicionais_texto))
conn.commit()
# Layout da página
st.title("🍧 Loja de Açaí")
st.header("Escolha seu Açaí")
produtos = listar_produtos()
produtos_dict = {f"{nome} - {tamanho} - R$ {preco:.2f}": id for id, nome, preco, tamanho in produtos}
produto_escolhido = st.selectbox("Selecione um produto", list(produtos_dict.keys()))
adicionais = listar_adicionais()
adicionais_selecionados = st.multiselect(
"Escolha adicionais (opcional)",
[f"{nome} - R$ {preco:.2f}" for id, nome, preco in adicionais]
)
st.header("Seus Dados")
nome_cliente = st.text_input("Nome completo")
telefone = st.text_input("Telefone")
bairro = st.text_input("Bairro")
if st.button("Confirmar Pedido"):
if nome_cliente and telefone and produto_escolhido:
# Captura IDs dos adicionais selecionados
adicionais_nomes = [a.split(' - ')[0] for a in adicionais_selecionados]
produto_id = produtos_dict[produto_escolhido]
registrar_pedido(nome_cliente, telefone, bairro, produto_id, adicionais_nomes)
st.success("Pedido enviado com sucesso!")
st.balloons()
else:
st.error("Preencha seu nome, telefone e selecione um produto!")
st.divider()
st.subheader("📋 Últimos Pedidos")
cursor.execute('''
SELECT pedidos.nome_cliente, produtos.nome, produtos.tamanho, itens_pedido.adicionais, pedidos.data_hora
FROM pedidos
JOIN itens_pedido ON pedidos.id = itens_pedido.pedido_id
JOIN produtos ON produtos.id = itens_pedido.produto_id
ORDER BY pedidos.data_hora DESC
LIMIT 5
''')
ultimos_pedidos = cursor.fetchall()
for ped in ultimos_pedidos:
st.write(f"**{ped[0]}** pediu **{ped[1]} {ped[2]}** com _{ped[3]}_ em {ped[4]}")
🚀 Como Rodar:
- Instalar o Streamlit:
bashCopiarEditarpip install streamlit
- Criar o arquivo
app.py
com o código acima. - Rodar o aplicativo:
bashCopiarEditarstreamlit run app.py
- Vai abrir o navegador automaticamente!
(Você verá a lojinha de Açaí funcionando 💜)
📋 O que esse exemplo ensina:
- Conexão SQLite
- Interface web amigável
- Escolha de produtos e adicionais
- Registro de pedidos
- Feedback visual para o usuário
- Listagem dos últimos pedidos feitos