Plataforma de aprendizagem de holandês focada em contabilidade — construída com Flask, SQLAlchemy e SQLite.
- Login / registo com objetivo pessoal e tempo diário de estudo
- Painel com XP, moedas, sequência de dias (streak), gráfico semanal, progresso do curso
- Curso estruturado (A0/A1): módulos gerais + módulos de contabilidade
- 8 tipos de exercícios interativos por lição (escolha múltipla, tradução, completar frases, ordenar frases, ditado, quiz cronometrado, encontrar erro, correspondência) + jogo da memória
- Sistema de flashcards com repetição espaçada (algoritmo tipo SM-2 / Anki)
- 12 capítulos de gramática completos, com tabelas e exercícios próprios
- Gamificação: moedas, 10 badges, 6 missões diárias/semanais
- Dicionário pesquisável com 143 palavras (geral + contabilidade)
- Leituras graduais (4 histórias) com palavras clicáveis, áudio e tradução
- Diálogos temáticos (3 conversas) com balões de chat e áudio
- Career Mode (5 cenários): entrevistas, emails profissionais, formulários
- Escrita livre (5 exercícios) com checklist automático de palavras-chave
- Painel de administração (gestão de vocabulário e utilizadores)
- Dark mode
- Identidade visual própria (inspirada no De Stijl / Mondrian)
Precisas de ter Python 3.10+ instalado.
cd dutch_master
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activatepip install -r requirements.txtpython seed_data.pyIsto cria o ficheiro dutch_master.db (SQLite) com todo o conteúdo.
seed_data.py de novo APAGA todos os dados existentes (incluindo contas de utilizador criadas). Só corre isto uma vez, ou quando quiseres reiniciar tudo do zero.
python app.pyAbre o browser em: http://127.0.0.1:5000
O primeiro utilizador que criares (registares) torna-se automaticamente administrador. Depois de criares essa conta, vai aparecer um link "⚙️ Admin" no menu — daí consegues gerir o vocabulário (adicionar/editar/eliminar palavras) e ver a lista de utilizadores.
Se quiseres tornar outra conta existente em administrador manualmente, corre isto no terminal (dentro da pasta do projeto, com o ambiente virtual ativo):
python3 -c "
from app import app
from models import db, User
with app.app_context():
u = User.query.filter_by(username='O_TEU_USERNAME').first()
u.is_admin = True
db.session.commit()
print('Admin ativado para', u.username)
"Clica no botão 🌙 no canto superior direito do menu para alternar entre tema claro e escuro. A preferência fica guardada no browser (localStorage), por isso mantém-se ativa da próxima vez que abrires a app.
dutch_master/
├── app.py # Rotas Flask e lógica principal
├── models.py # Modelos da base de dados (SQLAlchemy)
├── seed_data.py # Script que popula todo o conteúdo
├── gamification.py # Lógica de badges, missões e moedas
├── requirements.txt
├── static/
│ └── css/style.css # Design system (De Stijl / Mondrian + dark mode)
└── templates/ # Páginas HTML (Jinja2)
└── admin/ # Templates do painel de administração
- Áudio pré-gravado (atualmente usa a voz sintética do browser via SpeechSynthesis)
- Correção automática de escrita mais avançada (atualmente é um checklist de palavras-chave + resposta modelo para autoavaliação, não correção gramatical real)
- Painel de administração mais completo (atualmente cobre vocabulário; lições/leituras/diálogos/gramática ainda são geridos via
seed_data.py) - Mais níveis (A2, B1, B2) e expansão contínua do dicionário
- Ranking entre utilizadores (só faz sentido com uma base de utilizadores reais)
- Base de dados: SQLite (ficheiro local
dutch_master.db), criado automaticamente - Autenticação: Flask-Login, palavras-passe encriptadas com Werkzeug
- Não uses este servidor em produção — o Flask development server (
app.run(debug=True)) é só para uso local/desenvolvimento - A chave secreta em
app.py(SECRET_KEY) deve ser alterada antes de qualquer deployment real
Esta app não funciona no Vercel ou Netlify (são para sites estáticos). Usa o Render.com, que suporta apps Flask com plano gratuito.
- Cria uma conta em github.com (se ainda não tiveres)
- Cria um novo repositório (ex:
dutch-master) - Faz upload da pasta
dutch_masterpara esse repositório (podes arrastar os ficheiros diretamente na interface do GitHub, em "Add file" → "Upload files", ou usar o Git na linha de comandos se preferires)
- Vai a render.com e cria uma conta (podes usar login do GitHub, facilita)
- Clica em "New +" → "Web Service"
- Liga a tua conta do GitHub e seleciona o repositório
dutch-master
O Render deve detetar automaticamente o ficheiro render.yaml incluído no projeto e preencher tudo sozinho. Se não detetar, preenche manualmente:
- Name: dutch-master (ou o que preferires)
- Runtime: Python 3
- Build Command:
pip install -r requirements.txt - Start Command:
gunicorn app:app - Plan: Free
Clica em "Create Web Service". O primeiro deploy demora alguns minutos.
Depois do deploy terminar com sucesso:
- No painel do Render, abre o teu serviço
- Vai ao separador "Shell" (ou "Console")
- Corre:
python seed_data.py
Isto cria todo o conteúdo (módulos, lições, gramática, etc.) na base de dados online.
seed_data.py esta primeira vez. Se o correres de novo mais tarde, apaga tudo (incluindo contas de utilizador) e recria do zero.
O Render dá-te um URL tipo https://dutch-master.onrender.com — é esse o link que passas a usar.
No plano gratuito do Render, o sistema de ficheiros não é garantidamente permanente entre reinícios do serviço (o que acontece, por exemplo, após um novo deploy, ou por vezes automaticamente após longos períodos de inatividade). Isto significa que a base de dados SQLite pode ocasionalmente perder dados.
Para um projeto pessoal isto é aceitável na fase inicial, mas se quiseres garantir que nunca perdes progresso, a solução mais robusta é trocar o SQLite por uma base de dados externa persistente (ex: Render Postgres, que tem um plano gratuito próprio, ou Supabase). Se chegares a esse ponto, diz-me e ajudo a fazer essa migração — exige alterar poucas linhas no app.py, porque já usamos SQLAlchemy.