BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Portal esportivo do futebol urucuiense — notícias, classificações, jogos, transmissões ao vivo e galeria de fotos. Acesse http://localhost:3000.檢視完整 README ↗
Portal esportivo do futebol urucuiense — notícias, classificações, jogos, transmissões ao vivo e galeria de fotos.
| Camada | Tecnologia |
|---|---|
| Framework | Next.js 15 (App Router, Turbopack) |
| Linguagem | TypeScript 5 |
| Banco de dados | PostgreSQL 16 + Drizzle ORM |
| Estilização | Tailwind CSS v4 |
| Autenticação | JWT (jose) + Refresh Tokens + bcryptjs |
| Validação | Zod |
| Testes | Vitest |
| Monitoramento | Sentry |
| Infra | Docker + Docker Compose |
| CI | GitHub Actions |
# 1. Clone o repositório
git clone https://github.com/Lucier/urucuisports.git
cd urucuisports
# 2. Instale as dependências
pnpm install
# 3. Configure as variáveis de ambiente
cp .env.example .env.local
# Edite .env.local com suas credenciais
# 4. Execute as migrações
pnpm db:migrate
# 5. (Opcional) Popule o banco com dados de exemplo
pnpm db:seed
# 6. Inicie o servidor de desenvolvimento
pnpm dev
Acesse http://localhost:3000.
| Variável | Descrição |
|---|---|
DATABASE_URL | URL de conexão PostgreSQL |
JWT_SECRET | Segredo para assinatura JWT (mín. 32 bytes) |
NEXT_PUBLIC_API_URL | URL pública da aplicação (sem barra final) |
SENTRY_DSN | DSN do Sentry (servidor) — opcional |
NEXT_PUBLIC_SENTRY_DSN | DSN do Sentry (cliente) — opcional |
SENTRY_ORG | Organização no Sentry — opcional |
SENTRY_PROJECT | Projeto no Sentry — opcional |
SENTRY_AUTH_TOKEN | Token para upload de source maps — opcional |
Gere o JWT_SECRET com:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
pnpm dev # Servidor de desenvolvimento (Turbopack)
pnpm build # Build de produção
pnpm start # Inicia o servidor de produção
pnpm lint # ESLint
pnpm type-check # TypeScript sem emitir arquivos
pnpm test # Testes unitários (Vitest)
pnpm test:coverage # Cobertura de testes
pnpm db:generate # Gera nova migração a partir do schema
pnpm db:migrate # Executa migrações pendentes
pnpm db:studio # Abre o Drizzle Studio (UI visual do banco)
pnpm db:seed # Popula o banco com dados de exemplo
# Copie e configure o arquivo de ambiente
cp .env.example .env
# Edite .env com DB_PASSWORD, JWT_SECRET e NEXT_PUBLIC_API_URL
# Suba todos os serviços (app + postgres + backup automático)
docker compose up -d
A aplicação ficará disponível em http://localhost:3000.
O serviço db-backup gera backups diários comprimidos em ./backups/ e remove automaticamente os arquivos com mais de 7 dias.
src/
├── app/ # Rotas e páginas (App Router)
│ ├── admin/ # Painel administrativo (protegido)
│ ├── api/ # API Routes (auth, health)
│ ├── estatisticas/ # Classificação e artilharia por liga
│ ├── fotos/ # Galeria de fotos
│ ├── noticias/ # Listagem e detalhe de notícias
│ └── transmissoes/ # Transmissões ao vivo
├── components/ # Componentes reutilizáveis
│ ├── admin/ # Componentes do painel admin
│ ├── home/ # Seções da página inicial
│ ├── layout/ # Navbar, Footer
│ └── ui/ # Componentes genéricos (SafeImage, etc.)
├── database/
│ ├── schema.ts # Definição de todas as tabelas
│ ├── migrations/ # Migrações SQL geradas pelo Drizzle
│ └── seed.ts # Dados de exemplo
├── lib/ # Utilitários do servidor (auth, jwt, rate-limit)
├── modules/ # Módulos de domínio (auth, users)
├── shared/ # Tipos e utilitários compartilhados
└── tests/ # Testes unitários
| Tabela | Descrição |
|---|---|
users | Usuários e administradores |
refresh_tokens | Tokens de refresh com rotação e revogação |
leagues | Ligas e torneios |
rounds | Rodadas de cada liga |
matches | Partidas com placar e status |
standings | Tabela de classificação |
top_scorers | Artilharia |
teams | Times participantes |
players | Jogadores vinculados a times |
posts | Notícias com soft delete |
categories | Categorias de notícias |
streams | Transmissões ao vivo (YouTube) |
photo_albums | Álbuns de fotos |
advertisers | Anunciantes exibidos na home |
httpOnly)SessionKeepAlive renova o access token automaticamente 5 minutos antes do vencimento, sem interromper a sessão do administradorO pipeline do GitHub Actions (.github/workflows/ci.yml) executa em cada push/PR:
tsc --noEmitnext build (depende dos dois jobs anteriores)