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:

  1. 🎯 Casos de Uso
  2. 📦 Diagrama de Classes
  3. 🛢️ Tabelas (Banco de Dados)
  4. 🖥️ 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:

  1. Instalar o Streamlit:
bashCopiarEditarpip install streamlit
  1. Criar o arquivo app.py com o código acima.
  2. Rodar o aplicativo:
bashCopiarEditarstreamlit run app.py
  1. 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