尚未检测到更新。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.