尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Fantasy-Football-App für die Swiss Super League 26/27 — FPL-artig: Budget-Kader aus 15 Spielern, wöchentliche Aufstellung mit Kapitän, limitierte Transfers pro Spieltag, automatischer Punkte-Sync via API-Football, Admin-Tool für manuelle Korrekturen.
supabase/migrations/0001_init.sql
einmal komplett ausführen. Das legt alle Tabellen, Views, Trigger und RLS-Policies an..env.local kopieren
(siehe unten): Project URL, anon public Key, service_role Key.league_settings (Tabelle mit genau einer Zeile, id = 1) die Saison-
Parameter setzen (Budget, Kadergrösse, Slots pro Position, Transferkosten).
Falls die Zeile noch fehlt, einmalig per SQL-Editor einfügen.gameweeks) importieren — entweder manuell
über den Table Editor oder per SQL-Insert. Pro Spieltag: season, number,
deadline (Zeitpunkt, ab dem Transfers gesperrt werden)./fixtures und /fixtures/players abdeckt.GET https://v3.football.api-sports.io/leagues?search=Switzerland
Header: x-apisports-key: <dein-key>
Aus der Antwort die league.id für "Swiss Super League" notieren.clubs.api_football_team_id und players.api_football_player_id in
Supabase mit den entsprechenden IDs aus /teams bzw. /players befüllen —
ohne diese Zuordnung kann der Cron-Sync Spieler nicht matchen.Bekannte Einschränkung: Die API liefert keine Eigentore. Diese müssen im Admin-Panel manuell pro Spieler/Spieltag eingetragen werden.
.env.local.example nach .env.local kopieren und ausfüllen:
cp .env.local.example .env.local
| Variable | Woher |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Supabase → Project Settings → API |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase → Project Settings → API |
SUPABASE_SERVICE_ROLE_KEY | Supabase → Project Settings → API (geheim halten!) |
API_FOOTBALL_KEY | api-football.com Dashboard |
API_FOOTBALL_BASE_URL | i.d.R. https://v3.football.api-sports.io |
API_FOOTBALL_LEAGUE_ID | siehe Schritt 2 oben |
CRON_SECRET | Zufälliger String, z. B. openssl rand -base64 32 |
Ohne E-Mail-Bestätigung könnten Bots massenhaft Accounts anlegen. Cloudflare Turnstile ist ein kostenloser CAPTCHA-Ersatz, der Registrierung und Login schützt (für echte Nutzer meist unsichtbar). Solange kein Site-Key gesetzt ist, bleibt der Schutz inaktiv und die Formulare laufen normal.
Einrichten:
localhost). Widget-Typ „Managed" wählen..env.local bzw. Vercel als
NEXT_PUBLIC_TURNSTILE_SITE_KEYnpm install
npm run dev
App läuft auf http://localhost:3000.
Es gibt bewusst keinen Weg, sich selbst zum Admin zu machen (Sicherheit gegen Rechte-Eskalation). Nach der ersten Registrierung manuell in Supabase per SQL-Editor:
update profiles set role = 'admin' where username = 'dein-username';
Danach ist unter /admin das Gameweek-Management sichtbar: Spieltage
sperren/entsperren, Statistiken pro Spieler überschreiben, Punkte neu
berechnen.
Der Endpunkt /api/cron/sync holt Spielstände und Statistiken. Er muss
regelmässig aufgerufen werden — alle 15 Minuten, damit die Punkte während
laufender Partien mitlaufen.
⚠️ Vercels vercel.json-Cron reicht im Hobby-Tarif nicht: Dort läuft
ein Job nur einmal täglich, und selbst dann zu beliebiger Minute
innerhalb der Stunde. Ein häufigerer Ausdruck lässt das Deployment
fehlschlagen — deshalb steht in vercel.json bewusst 0 3 * * *
(nächtlicher Rückfall-Lauf, der im Hobby-Tarif akzeptiert wird).
Zwei Wege:
A) Supabase pg_cron (empfohlen, kostenlos) — läuft in deinem
bestehenden Supabase-Projekt, minutengenau, kein zusätzlicher Dienst:
supabase/migrations/0009_cron_sync.sql
im SQL-Editor ausführen, vorher die beiden Platzhalter <APP_URL> und
<CRON_SECRET> ersetzen. Kontrolle:
select * from cron.job_run_details order by start_time desc limit 10;
B) Vercel Pro (~20 USD/Monat) — dann greift vercel.json wie
konfiguriert, ohne weiteres Zutun.
Variante A hält die laufenden Kosten bei den ~19 USD für API-Football.
src/app/api/cron/sync/route.ts) synchronisiert immer nur den
aktuellsten gesperrten Spieltag (der mit der höchsten Nummer, dessen
Deadline verstrichen ist), um das API-Kontingent zu schonen.player_stats. Admin-Korrekturen leben separat in
player_stats_overrides und werden beim Berechnen der Punkte
(src/lib/gameweek-scoring.ts) darübergelegt — ein Sync überschreibt also
nie eine manuelle Korrektur.