Nelson Coelho
Painel de treino para Nelson Coelho com detalhes de corrida, métricas de recuperação e análise de desempenho
翻譯準備中
AI 摘要 · 網站內容
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Versão web do FutStats: as mesmas telas do app (React Native), com o mesmo tema escuro, feita para o Safari do iPhone e também para o computador (coluna central de até 520 px).
out/).docs/API.md). Não há servidor próprio.Precisa do Node 20 ou mais novo. O projeto foi feito com o 22 (arquivo .nvmrc), que o nvm use seleciona.
cd ~/Documentos/App-Futebol/App-Futebol_FrontEnd_WEB
nvm use # troca para o Node 22 do .nvmrc
npm install # só na primeira vez (ou quando o package.json mudar)
npm run dev # abra http://localhost:3000
O npm run dev recarrega a página sozinho a cada arquivo salvo. Para parar: Ctrl+C.
Versão de produção (exatamente o que vai para a Vercel/GitHub Pages):
npm run build # gera a pasta out/
npm start # serve a out/ em http://localhost:3000
No iPhone, com o celular no mesmo Wi-Fi do computador:
npm run dev -- -H 0.0.0.0 # ou: npm run build && npm start
hostname -I # o primeiro número é o IP do computador (ex: 192.168.1.14)
No Safari do iPhone, abra http://<IP do computador>:3000. Se não abrir, confira se o firewall libera
a porta 3000 (sudo ufw status). No modo dev, o aviso "Cross origin request detected" no terminal
é esperado e não atrapalha.
| Comando | O que faz |
|---|---|
npm run dev | Servidor de desenvolvimento |
npm run build | Gera o site estático em out/ |
npm start | Serve a pasta out/ (depois do build) em http://localhost:3000 |
npm test | Testes unitários (Vitest) |
npm run typecheck | tsc --noEmit |
npm run lint | ESLint (inclui as dependências dos efeitos do React) |
Copie .env.example para .env.local se precisar mudar algo.
| Variável | Padrão | Para que serve |
|---|---|---|
NEXT_PUBLIC_API_URL | https://futapp-r38z.onrender.com | URL da API |
NEXT_PUBLIC_BASE_PATH | vazio | Só para hospedar numa subpasta (ex: GitHub Pages em usuario.github.io/futstatis-web → /futstatis-web; o workflow do Pages já preenche) |
São lidas no build (o site é estático): mudou, gere de novo.
A tela escondida /servidor/ troca a URL da API só naquele navegador (fica no localStorage),
para testar outro servidor sem novo build. Ao trocar, a cópia local dos dados e os tokens são apagados.
O site é estático, então as telas com ID usam parâmetros na URL em vez de caminhos dinâmicos
(/jogo/?id=... em vez de /jogo/123). Assim cada tela é um único index.html que funciona em
qualquer hospedagem estática, sem regra de reescrita, e um link copiado abre direto na tela certa.
| Tela | Endereço |
|---|---|
| Home (Ao Vivo / Todos Jogos) | / |
| Liga | /liga/?codigo=BSA |
| Time | /time/?id=1783 (o api_id do time) |
| Jogo | /jogo/?id=<ID da ESPN ou match_id>&league=BSA&date=...&espn_home=...&espn_away=...&match_id=... |
| Jogador | /jogador/?id=235017 |
| Busca | /busca/?q=flamengo |
| Minhas Ligas | /minhas-ligas/ |
| Admin (escondida: 7 toques no logo) | /admin/ |
| Servidor da API (escondida, pelo admin) | /servidor/ |
output: 'export' do next.config.mjs faz a Vercel servir os arquivos estáticos).NEXT_PUBLIC_API_URL em Settings → Environment Variables.https://futstatis-web.vercel.app.Outras hospedagens: o comando de build é npm run build e a pasta publicada é out/
(Netlify, Cloudflare Pages, um servidor nginx...).
O workflow .github/workflows/deploy-pages.yml já faz tudo: roda os testes, gera o site e publica.
Crie um repositório no GitHub (ex: futstatis-web). No plano grátis ele precisa ser público.
Suba o projeto (esta pasta ainda não é um repositório git):
git init -b main
git add .
git commit -m "Versão web do FutStats"
git remote add origin https://github.com/<seu-usuario>/futstatis-web.git
git push -u origin main
No repositório: Settings → Pages → Build and deployment → Source: GitHub Actions.
Na aba Actions, rode de novo o workflow "Publicar no GitHub Pages" (o primeiro, disparado
pelo push, falha se o Pages ainda não estava ativado). Depois disso, cada push na main publica sozinho.
O site fica em https://<seu-usuario>.github.io/futstatis-web/.
O site fica numa subpasta (/futstatis-web/), e o workflow já gera o build com o caminho certo
(NEXT_PUBLIC_BASE_PATH). Num repositório <seu-usuario>.github.io ou com domínio próprio, o site
fica na raiz, e o workflow também percebe isso sozinho.
Dá para usar Vercel e GitHub Pages ao mesmo tempo: o build da Vercel não usa subpasta.
A API já libera chamadas de navegador de qualquer origem (CORS_ALLOWED_ORIGINS vazio no Render).
Se um dia o backend passar a restringir, cadastre lá o domínio do site e o de desenvolvimento,
separados por vírgula:
CORS_ALLOWED_ORIGINS=https://futstatis-web.vercel.app,https://<seu-usuario>.github.io,http://localhost:3000
(Troque pelos domínios reais; domínio próprio também entra na lista.) No GitHub Pages a origem é só
https://<seu-usuario>.github.io, sem o nome do repositório. Para testar no iPhone pela rede, inclua
também http://<IP do computador>:3000. Sem isso, o navegador bloqueia as chamadas e o site não
carrega nada.
O FutStats abre como app, em tela cheia, com o ícone próprio. A tela Minhas Ligas mostra essa dica para quem ainda está usando pelo navegador.
src/
app/ páginas (cada uma só lê o endereço e chama a tela)
components/screens/ as telas: Home, Liga, Time, Jogo, Jogador, Busca, Minhas Ligas, Admin, Servidor
components/ peças reaproveitadas: linha de jogo, classificação, chaveamento, folha de baixo...
config/leagues.ts cadastro único das ligas: nome, ícone, fases, chaveamento, legendas
lib/api.ts cliente HTTP: token de convidado/admin, tempo limite, nova tentativa, cópia local
lib/apiCache.ts cópia local das respostas (localStorage)
lib/dates.ts parseMatchDate e formatação de datas (fuso do aparelho, pt-BR)
lib/matches.ts regras de jogos: ida e volta, agregado, pênaltis, fases, V/E/D
hooks/useLiveStandings.ts classificação ao vivo (botão "Ao vivo")
Tudo o que muda de liga para liga vem de config/leagues.ts: para cadastrar uma liga nova basta uma
entrada lá. Liga fora do cadastro (ex: vinda da busca) funciona como pontos corridos.
Comportamentos importantes:
force_update=true/update=true. Se o token de admin vencer, o site volta para convidado e avisa.Os avisos de jogos chegam também no navegador (docs/API.md, "Push no navegador"):
public/sw.js: service worker que mostra o aviso e, no toque, abre o jogo (ou a liga).src/lib/webPush.ts: chave do servidor (/push/web-key), permissão, inscrição e POST /push/register com platform: "web"./push/web-key com erro), estrelas e opção ficam escondidas.Os ícones de public/icons/ vêm do ícone do app (AppFutebolApp/assets/images/icon.png), redimensionado para 32, 180, 192 e 512 px.