App Flutter de gestão e agendamento para o estúdio Funcional do Pulguinha, baseado no protótipo React (pulguinha-app.jsx).
O primeiro admin é criado pelo supabase/schema.sql ao configurar o banco. Em modo demo (sem Supabase), use as mesmas credenciais definidas no seed.
| Campo | Valor inicial |
|---|---|
admin@pulguinha.com |
|
| Senha | admin123 |
Na tela de login, selecione o perfil Admin antes de entrar.
Altere a senha no banco (
admins) antes de usar em produção. As credenciais não aparecem mais na interface do app.
flutter pub get
flutter run
Sem variáveis de ambiente, o app roda em modo demo com dados mock locais.
flutter analyze
flutter test
flutter build web --release --base-href "/pulguinha/"
supabase/schema.sql (estrutura). Dados demo opcionais: supabase/seed.sql. Banco já em produção: supabase/migration_minimal.sql--dart-define para override no build; senão o app usa os defaults em lib/config/supabase_config.dart:flutter run
# ou com override:
flutter run \
--dart-define=SUPABASE_URL=https://SEU_PROJETO.supabase.co \
--dart-define=SUPABASE_ANON_KEY=sua_chave_anon_aqui
A chave anon é pública no modelo Supabase (protegida por RLS). Para o Pulguinha single-tenant, está commitada no código. Nunca commite a
service_rolekey.
Fotos: armazenadas em base64 no campo
fotodo aluno (demo). Em produção, prefira Supabase Storage.
A integração real está implementada em lib/services/mercado_pago_service.dart. O access token nunca vai para o app — apenas para a Edge Function.
--dart-define por produto:flutter run \
--dart-define=MP_PUBLIC_KEY=SUA_PUBLIC_KEY \
--dart-define=MP_LINK_PLANO_MENSAL=https://mpago.la/... \
--dart-define=MP_LINK_PLANO_TRIMESTRAL=https://mpago.la/... \
--dart-define=MP_LINK_PLANO_SEMESTRAL=https://mpago.la/... \
--dart-define=MP_LINK_PLANO_ANUAL=https://mpago.la/...
supabase functions deploy create-mp-preference
supabase secrets set MP_ACCESS_TOKEN=SEU_ACCESS_TOKEN_MP
flutter run \
--dart-define=SUPABASE_URL=https://SEU_PROJETO.supabase.co \
--dart-define=SUPABASE_ANON_KEY=sua_chave_anon \
--dart-define=MP_PUBLIC_KEY=SUA_PUBLIC_KEY
--dart-define=MP_BACK_URL=pulguinha://payment/successSem credenciais configuradas, a loja usa modo demonstração com aviso explícito.
mobile_scanner; se a câmera falhar, use entrada manual do códigoO workflow .github/workflows/deploy.yml faz build e deploy automático a cada push na branch main.
Se o site mostra o conteúdo deste README em vez do app, a causa é quase sempre a origem do Pages estar em “Deploy from a branch” em vez de GitHub Actions. Veja a seção abaixo.
main / (root))app.seudominio.com.br)PAGES_CUSTOM_DOMAIN — domínio completo (ex.: app.seudominio.com.br)base-href / e gera o arquivo CNAME automaticamente.SUPABASE_URL — URL do projeto SupabaseSUPABASE_ANON_KEY — chave anon públicamainAguarde o workflow terminar com sucesso (check verde). O app ficará em:
https://jracingdev.github.io/pulguinha/
Recomendamos um subdomínio (ex.: app.funcionaldopulguinha.com.br) — configuração mais simples e estável.
Opção A — Subdomínio (recomendado) — ex.: app.seudominio.com.br
| Tipo | Nome | Destino |
|---|---|---|
| CNAME | app | jracingdev.github.io |
Opção B — Domínio raiz (apex) — ex.: seudominio.com.br
| Tipo | Nome | Destino |
|---|---|---|
| A | @ | 185.199.108.153 |
| A | @ | 185.199.109.153 |
| A | @ | 185.199.110.153 |
| A | @ | 185.199.111.153 |
(Opcional, IPv6 — adicione também 4 registros AAAA com os valores oficiais do GitHub Pages.)
Para www.seudominio.com.br, adicione CNAME www → jracingdev.github.io.
A propagação DNS pode levar de alguns minutos até 24 horas.
app.seudominio.com.br) → SavePAGES_CUSTOM_DOMAIN com o mesmo domíniomain)O app passará a abrir em https://app.seudominio.com.br/ (sem /pulguinha/ no final).
Mercado Pago / Supabase: se usar callbacks ou URLs de retorno, atualize-as para o novo domínio.
https://funcionaldopulguinha.com.br/loja — abre a loja sem loginloja.funcionaldopulguinha.com.br: o GitHub Pages aceita apenas um domínio por repositório. Remova o CNAME de loja e configure redirecionamento no Registro.br:
loja.funcionaldopulguinha.com.brhttps://funcionaldopulguinha.com.br/lojaO APK já vem com URL e chave anon do Supabase embutidas em lib/config/supabase_config.dart. Qualquer celular conecta automaticamente — não é necessário colar credenciais em Configurações.
| Onde | Configuração necessária |
|---|---|
| Cada celular | Nenhuma — instalar e usar |
| GitHub Actions (web) | Secrets SUPABASE_URL + SUPABASE_ANON_KEY (opcional para APK; obrigatório só se quiser override no CI) |
| Build local | .\scripts\build_apk.ps1 — usa credenciais embutidas |
Tela Conexão Supabase (avançado): só para trocar de projeto (white-label) ou ambiente de teste. O admin normal não precisa abrir essa tela.
# Build local (credenciais já no código)
.\scripts\build_apk.ps1
# Override opcional no build
$env:SUPABASE_URL="https://....supabase.co"
$env:SUPABASE_ANON_KEY="eyJ..."
.\scripts\build_apk.ps1
flutter build web --release --base-href "/pulguinha/"
Com Supabase:
flutter build web --release --base-href "/pulguinha/" \
--dart-define=SUPABASE_URL=https://SEU_PROJETO.supabase.co \
--dart-define=SUPABASE_ANON_KEY=sua_chave_anon_aqui
lib/
├── app.dart # Roteamento principal
├── config/
│ ├── supabase_config.dart # URL e chave via --dart-define
│ └── mercado_pago_config.dart # MP public key, payment links
├── services/
│ ├── supabase_service.dart # CRUD Supabase
│ └── mercado_pago_service.dart # Checkout Pro / Payment Links
├── screens/ # Telas por módulo
├── theme/ # Cores e tema escuro neon
└── widgets/ # Componentes reutilizáveis
supabase/
├── schema.sql # Tabelas, RLS e dados iniciais (seed)
└── functions/create-mp-preference/index.ts # Cria preferência MP (access token no secret)