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.686 ]

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

Instalação do Android CyanogenMod na linha Moto G

Basicão Funtoo

Não precisamos de antivírus, eles sim

Onde o GNU/Linux ganha de lavada do Windows

Flatpak: usar ou não usar?

Leitura recomendada

Usando o NetBSD como desktop

Experimentando o Looking Glass

Gerando em tempo real efeito de voz robotizada

Como submeter dados de CDDB de um CD de áudio ao Freedb

Assembler no Linux

  
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