Files
MyClub/DOCS
Tomas Dvorak 84a8acf944 update
2026-03-02 20:20:56 +01:00
..
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2026-01-26 08:13:18 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2025-11-02 21:31:00 +01:00
2025-10-21 15:02:05 +02:00
2026-01-26 08:13:18 +01:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-21 15:02:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-19 17:16:57 +02:00
2025-10-20 10:40:55 +02:00
2025-10-20 10:40:55 +02:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 17:10:13 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 17:10:13 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-10-16 17:10:13 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-11 10:29:30 +01:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2025-10-16 13:32:05 +02:00
2025-10-17 17:39:11 +02:00
2025-10-17 17:39:11 +02:00
2025-10-17 17:39:11 +02:00
2025-10-17 17:39:11 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-14 15:53:12 +01:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-19 17:16:57 +02:00
2025-10-19 17:16:57 +02:00
2025-10-16 13:32:05 +02:00
2026-03-02 20:20:56 +01:00
2025-11-02 21:31:00 +01:00
2025-10-16 17:10:13 +02:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2025-11-21 08:44:44 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-21 15:02:05 +02:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-21 15:02:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 17:10:13 +02:00
2025-10-16 17:10:13 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 17:10:13 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-19 17:16:57 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 17:10:13 +02:00
2025-10-21 15:02:05 +02:00
2025-10-21 15:02:05 +02:00
2025-11-02 01:04:02 +01:00
2025-10-21 15:02:05 +02:00
2025-10-17 17:39:11 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-19 18:09:28 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2025-10-20 10:40:55 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-03 19:54:39 +01:00
2025-11-03 19:54:39 +01:00
2025-11-03 19:54:39 +01:00
2025-11-03 19:54:39 +01:00
2025-11-03 19:54:39 +01:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-11-14 15:53:12 +01:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-14 15:53:12 +01:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-10-20 10:40:55 +02:00
2025-10-16 13:32:05 +02:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-11-02 21:31:00 +01:00
2025-10-21 15:02:05 +02:00
2025-11-02 21:31:00 +01:00
2025-11-14 15:53:12 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-14 15:53:12 +01:00
2025-10-16 13:32:05 +02:00
2025-11-14 15:53:12 +01:00
2025-10-16 17:10:13 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-14 15:53:12 +01:00
2025-10-21 15:02:05 +02:00
2025-11-14 15:53:12 +01:00
2025-10-17 17:39:11 +02:00
2025-10-17 17:39:11 +02:00
2026-01-26 08:13:18 +01:00
2025-10-16 13:32:05 +02:00
2026-01-26 08:13:18 +01:00
2025-11-14 15:53:12 +01:00
2025-11-14 15:53:12 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-19 17:16:57 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-11-14 15:53:12 +01:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00
2025-10-16 13:32:05 +02:00

Fotbal Club systém pro správu klubu

Moderní systém pro správu fotbalového klubu postavený na Go (Gin, GORM, PostgreSQL) a Reactu (Chakra UI, React Router, React Query).

Funkce

  • 🔐 Přihlášení pomocí JWT a role (admin/editor)
  • 📝 Články (blog) s kategoriemi, publikací, nahráváním obrázků
  • 🖼️ Bezpečné nahrávání souborů s kontrolou typu a velikosti
  • Správa týmů a hráčů
  • 📅 Zápasy a tabulky s integrací FACR (cache, aliasy soutěží, override názvů/log)
  • 💼 Sponzoři a bannery
  • 📧 Kontaktní formulář s emailovými notifikacemi
  • 🚀 REST API (připraveno pro Swagger)
  • 🐳 Docker pro snadný vývoj a nasazení
  • 🔄 Automatické migrace DB a seed dat
  • 🖥️ Moderní, responzivní frontend v češtině
  • 🍪 Lišta cookies s kategoriemi (nezbytné, preference, analytické, marketingové)

🚀 Rychlý start

Předpoklady

Spuštění přes Docker

  1. Klonujte repozitář:
git clone <repository-url>
cd fotbal-club
  1. Spusťte aplikaci:
docker-compose up -d

Spustí se backend API, databáze PostgreSQL, proběhnou migrace a nastartuje frontend.

  1. Přístup do aplikace:
  1. První spuštění:
  • Otevřete http://localhost:3000 budete přesměrováni na průvodce nastavením (vytvoření admin účtu, nastavení klubu a barev).

📂 Struktura projektu

fotbal-club/
├── frontend/           # React frontend
├── internal/           # Backend
│   ├── config/         # Konfigurace
│   ├── controllers/    # HTTP kontrolery
│   ├── middleware/     # Middleware (auth, admin)
│   └── models/         # DB modely
├── pkg/                # Znovupoužitelné balíčky (logger, utils)
├── database/           # Migrace
├── uploads/            # Nahrané soubory
├── cache/              # Cache (prefetch)
├── static/             # Statická aktiva
├── docker-compose.yml  # Docker Compose
└── main.go             # Vstupní bod aplikace

🔧 Konfigurace

Zkopírujte .env.example na .env a upravte:

cp .env.example .env

Klíčové proměnné:

  • JWT_SECRET tajný klíč pro JWT (změňte pro produkci)
  • DATABASE_URL připojení na PostgreSQL
  • UPLOAD_DIR cílová složka pro uploady (výchozí ./uploads)
  • MAX_UPLOAD_SIZE max. velikost souboru v bajtech
  • ALLOWED_ORIGINS povolené originy pro CORS (čárkou oddělené)
  • CONTACT_EMAIL, ADMIN_EMAIL, SMTP_* emailová konfigurace

Frontend (frontend/.env):

  • REACT_APP_API_URL např. http://localhost:8080/api/v1
  • REACT_APP_API_BASE_URL alternativa (bez /api), např. http://localhost:8080 (frontend automaticky připojí /api/v1)
  • REACT_APP_FACR_API_BASE_URL výchozí http://localhost:8080/api/facr
  • REACT_APP_FACR_CACHE_TTL TTL cache v ms (výchozí 3600000)

Poznámky k API URL na frontendu:

  • Pokud zadáte pouze origin (např. REACT_APP_API_BASE_URL=http://localhost:8080), klient frontend/src/services/api.ts automaticky doplní suffix /api/v1.
  • Při běhu přes Docker Compose se SPA vykresluje v prohlížeči hostitele. Proto musí být URL k backendu prohlížečem dosažitelná (použijte http://localhost:8080, nikoli název kontejneru jako http://backend:8080).

🛠 Lokální vývoj (bez Dockeru)

  1. Závislosti backendu:
go mod download
  1. Migrace a seed:
make migrate
make seed
  1. Backend:
make run
  1. Frontend:
cd frontend
npm install
npm start

🔒 Bezpečnost a zásady

  • Backend přidává hlavičky (CSP, X-Content-Type-Options, X-Frame-Options, Referrer-Policy).
  • JWT token je očekáván v Authorization: Bearer <token>.
  • Middleware JWTAuth ověřuje token, načte uživatele a ukládá do kontextu user, userID, userRole a claims.
  • Upload endpoint validuje MIME typy a velikost souboru; obrázky JPEG/PNG se komprimují.
  • Lišta cookies umožňuje volbu kategorií; rozhodnutí je uloženo v localStorage pod klíčem cookie_consent a vyvolá událost cookie-consent-change.

🧭 Frontend hlavní části

  • Veřejné stránky: Home, Blog, Článek, O klubu, Kalendář, Tabulky, Sponzoři, Kontakt, právní stránky.
  • Admin: přístup přes /admin (chráněno), layout s postranním menu, hlavičkou a pomocníkem.
  • Na stránce Admin Dashboard je vložena komponenta AdminHelp s rychlými tipy.

🧪 Testování

make test

Krytí:

go test -coverprofile=coverage.out ./... && go tool cover -html=coverage.out

🚀 Nasazení

Build Docker image

docker build -t fotbal-club .

Spuštění kontejneru

docker run -d \
  --name fotbal-club \
  -p 8080:8080 \
  --env-file .env \
  fotbal-club

Nahrané soubory jsou servírovány z /uploads (viz main.go).

📚 API

Základní přehled viz DOCS/api.md. Po zapnutí Swaggeru:

📖 Dokumentace

Veškerá dokumentace projektu byla přesunuta do složky DOCS/ pro lepší organizaci.

Hlavní dokumenty:

Kategorie dokumentace:

  • 🎨 MyUIbrix Visual Editor (Elementor)
  • Sparta Elements (nové!)
  • 🗺️ Mapy a lokace
  • 🧭 Navigační systém
  • 📊 Analytika & tracking
  • 📰 Správa obsahu
  • 🎟️ Aktivity & události
  • Zápasy & týmy
  • 📧 Newsletter
  • 📞 Kontakty
  • 🎨 Sponzoři & bannery
  • 📊 Ankety
  • 🔧 Admin & systém
  • 🚀 Performance & zabezpečení

Více informací v DOCS/README.md

📄 Licence

MIT viz soubor LICENSE.