Aplicação web com 4 botões em ecrã inteiro que regista cliques numa base de dados PostgreSQL (Replit Development Database). Inclui autenticação por PIN, dashboard de administração com gráficos e exportação para Excel.
Site publicado: https://click-counter--miguelpedrosa21.replit.app/
- Página de botões em ecrã inteiro (2×2) para uso em touchscreen.
- Registo de cada clique em PostgreSQL, com data/hora e metadados.
- Sequência diária por botão: cada botão tem a sua própria numeração (
$1,2,3,\dots$ ) e faz reset automaticamente no início de cada dia. - Acesso protegido por PIN:
- Ao abrir o site aparece o ecrã de login.
- O PIN é validado no backend e a sessão fica ativa até logout.
- Existe uma dica de desenvolvimento visível na própria página de login (botão flutuante). O PIN de desenvolvimento aparece aí.
- Dashboard Admin:
- Totais globais e totais do dia.
- Gráficos (por botão, últimos 14 dias, por hora no dia atual).
- Botão Help com popup de ajuda.
- Configurar botões: alterar nomes e carregar ícones (ícone + label no ecrã de botões).
- Exportação para Excel (
.xlsx) com os dados da tabela.
- Backend: Python + Flask
- Base de dados: PostgreSQL (via
DATABASE_URL), compsycopg2-binary(sem SQLAlchemy) - Frontend: HTML/CSS/JavaScript
- Gráficos: Chart.js (via CDN)
- Excel: openpyxl
- app.py — servidor Flask, autenticação, API, acesso PostgreSQL e export Excel
- templates/gate.html — ecrã de PIN (login)
- templates/admin.html — dashboard de administração
- templates/button-config.html — configurar botões (nomes + ícones)
- templates/buttons.html — página dos botões (ecrã inteiro)
- static/styles.css — estilos (botões, PIN, toasts)
- static/gate.js — login por PIN + dica de desenvolvimento
- static/app.js — envio de cliques para o backend
- static/admin.js / static/admin.css — dashboard (charts + help + logout)
- static/button-config.js — UI de configuração de botões
Tabela principal: click
Campos usados:
id(serial)button_id(int) — identificador do botão (1..4)button(text) — etiqueta humana (ex.: "Botão 1")seq(int) — sequência diária por botãodate,date_iso,time,timestamp— valores de data/hora (o backend é compatível com dados de versões antigas)
Tabela de autenticação:
passwords— guarda o hash do PIN (seed inicial viaADMIN_PIN)
Tabela de configuração dos botões:
button_config— guarda nomes e metadados do ícone (label, icon_key, icon_mime, icon_updated_at)- Os ficheiros de ícone são guardados no Replit Object Storage (bucket
BtnIcons).
- Os ficheiros de ícone são guardados no Replit Object Storage (bucket
Páginas:
GET /— login (PIN)GET /admin— dashboard (requer sessão)GET /admin/buttons— configurar botões (requer sessão)GET /buttons— página dos botões (requer sessão)
API:
POST /api/auth/pin— autentica ({"pin": "...."})POST /api/auth/logout— termina sessãoPOST /api/click— regista clique ({"button_id": 1}) e devolve{button_id, seq, date, time, ...}GET /api/admin/stats— estatísticas para os gráficosGET /api/buttons/config— lista nomes/ícones dos botõesPOST /api/buttons/config— atualiza o nome de um botãoPOST /api/buttons/icon/<id>— upload de ícone para o botãoGET /api/buttons/icon/<id>— obtém o ícone do botão
Export:
GET /admin/export.xlsx— descarrega.xlsx
- Importa o repositório no Replit (Import from GitHub).
- Garante que o Replit instala as dependências a partir de requirements.txt.
- Define os Secrets (Environment Variables):
DATABASE_URL— ligação PostgreSQL (Replit Development Database)ADMIN_PIN— PIN inicial (é guardado como hash na tabelapasswords)FLASK_SECRET_KEY— recomendado para sessão estável (string longa e aleatória)REPLIT_DB_URLnão é usado (Object Storage usa credenciais do ambiente)- opcional:
PGSSLMODE— por omissão é usadorequire
- Faz Run.
Nota: se vires dados no site mas não na aba “Development Database”, confirma que o DATABASE_URL corresponde exatamente à base de dados que estás a visualizar.
Pré-requisitos:
- Python 3.10+ (recomendado)
- Acesso a um PostgreSQL (local ou remoto)
Passos:
- Clonar o repositório:
git clone <URL_DO_REPO>cd ClickCounter
- Criar e ativar ambiente virtual:
- Windows (PowerShell):
python -m venv .venve depois./.venv/Scripts/Activate.ps1
- Windows (PowerShell):
- Instalar dependências:
pip install -r requirements.txt
- Definir variáveis de ambiente:
DATABASE_URL(ex.:postgresql://user:pass@host:5432/dbname)ADMIN_PINFLASK_SECRET_KEY- opcional:
PGSSLMODE=require
- Arrancar:
python app.py
- Abrir no browser:
http://localhost:5000/
- Não guardes o PIN em texto simples: o sistema guarda apenas hash.
- Em produção, muda o PIN e remove a exposição do PIN de desenvolvimento (a dica existe para facilitar desenvolvimento/testes).