Berry Bank: Criando um Banco Digital Gamificado para seus Filhos com Gentoo, Flask e Tailscale

Berry é a moeda do anime One Piece, um anime que meus filhos gostam. Aproveitando isso, resolvi criar um "banco virtual" para gerenciar os Berries deles.

[ Hits: 1.863 ]

Por: Xerxes em 15/02/2026


O Backend: Python e Flask



O principal do Berry Bank é o script app.py. Ele gerencia três coisas: exibe o saldo, autentica o "Pai" e processa as transações.

Crie o arquivo ~/berry_bank/app.py:

from flask import Flask, render_template, request, redirect, url_for, session
import sqlite3
from datetime import datetime

app = Flask(__name__)
app.secret_key = 'segredo_super_secreto_do_one_piece' # Troque por algo aleatório

# Configuração do Banco de Dados
def init_db():
    conn = sqlite3.connect('dados.db')
    c = conn.cursor()
    # Tabela de crianças e saldos
    c.execute('''CREATE TABLE IF NOT EXISTS kids 
                 (id INTEGER PRIMARY KEY, name TEXT, balance INTEGER)''')
    # Tabela de histórico de transações
    c.execute('''CREATE TABLE IF NOT EXISTS history 
                 (id INTEGER PRIMARY KEY, kid_id INTEGER, amount INTEGER, reason TEXT, timestamp TEXT)''')
    
    # Inserindo as crianças iniciais (se não existirem)
    c.execute("SELECT count(*) FROM kids")
    if c.fetchone()[0] == 0:
        c.execute("INSERT INTO kids (name, balance) VALUES (?, ?)", ("Filho2", 0))
        c.execute("INSERT INTO kids (name, balance) VALUES (?, ?)", ("Filho1", 0))
        conn.commit()
    conn.close()

# Rota Principal (Pública - Visualização)
@app.route('/')
def index():
    conn = sqlite3.connect('dados.db')
    conn.row_factory = sqlite3.Row
    c = conn.cursor()
    c.execute("SELECT * FROM kids")
    kids = c.fetchall()
    conn.close()
    return render_template('index.html', kids=kids)

# Rota de Login (Área do Pai)
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        if request.form['password'] == 'pai123': # Senha simples para uso local
            session['logged_in'] = True
            return redirect(url_for('admin'))
        else:
            return "Senha incorreta! A Marinha foi avisada."
    return render_template('login.html')

# Painel Administrativo
@app.route('/admin')
def admin():
    if not session.get('logged_in'): return redirect(url_for('login'))
    
    conn = sqlite3.connect('dados.db')
    conn.row_factory = sqlite3.Row
    c = conn.cursor()
    c.execute("SELECT * FROM kids")
    kids = c.fetchall()
    
    # Pega as últimas 5 transações
    c.execute("""SELECT h.amount, h.reason, h.timestamp, k.name 
                 FROM history h JOIN kids k ON h.kid_id = k.id 
                 ORDER BY h.id DESC LIMIT 5""")
    history = c.fetchall()
    conn.close()
    return render_template('admin.html', kids=kids, history=history)

# Processar Transação (Adicionar/Remover Berries)
@app.route('/update', methods=['POST'])
def update():
    if not session.get('logged_in'): return redirect(url_for('login'))
    
    kid_id = request.form['kid_id']
    amount = int(request.form['amount'])
    reason = request.form['reason']
    
    conn = sqlite3.connect('dados.db')
    c = conn.cursor()
    
    # Atualiza saldo
    c.execute("UPDATE kids SET balance = balance + ? WHERE id = ?", (amount, kid_id))
    
    # Registra no histórico
    timestamp = datetime.now().strftime("%d/%m %H:%M")
    c.execute("INSERT INTO history (kid_id, amount, reason, timestamp) VALUES (?, ?, ?, ?)",
              (kid_id, amount, reason, timestamp))
    
    conn.commit()
    conn.close()
    return redirect(url_for('admin'))

if __name__ == '__main__':
    init_db()
    # host='0.0.0.0' permite acesso da rede local
    app.run(host='0.0.0.0', port=5000)

A senha, como está no código, é "pai123".
Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. O Backend: Python e Flask
   3. O Frontend (estilo One Piece)
   4. A Página Administrativa (templates/admin.html)
   5. A Página do Login (templates/login.html)
   6. Automatizando com Systemd e conclusão
Outros artigos deste autor

Sujando as mãos ao instalar Arch Linux (método de instalação novo)

Onde o Linux perde feio para Windows

Deixando o BunsenLabs cinza de novo

Pipelight Flash vs. Fresh Player vs. Adobe Flash nativo vs. Pepper Flash nativo

Tema com cores vivas para Xfce no Xubuntu 12.04

Leitura recomendada

Clonar FreeBSD pela rede e sem downtime

Ressuscitando os 386 e 486 da vida com Linux

Stopmotion: Crie animações com objetos inanimados e brinquedos

Recuperando imagem ISO com falha usando JIGDO

Acessando partições ReiserFS pelo Windows

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts