- Vue 3 + Nuxt 3 Framework - Tailwind CSS Styling - Responsive Design mit schwarz-roten Vereinsfarben - Dynamische Galerie mit Lightbox - Event-Management über CSV-Dateien - Mannschaftsübersicht mit dynamischen Seiten - SMTP-Kontaktformular - Google Maps Integration - Mobile-optimierte Navigation mit Submenus - Trainer-Übersicht - Vereinsmeisterschaften, Spielsysteme, TT-Regeln - Impressum mit Datenschutzerklärung
42 lines
1.1 KiB
JavaScript
42 lines
1.1 KiB
JavaScript
import { promises as fs } from 'fs'
|
|
import path from 'path'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
const galerieDir = path.join(process.cwd(), 'public', 'galerie')
|
|
|
|
// Prüfe, ob das Verzeichnis existiert
|
|
try {
|
|
await fs.access(galerieDir)
|
|
} catch {
|
|
return []
|
|
}
|
|
|
|
// Lese alle Dateien im Verzeichnis
|
|
const dateien = await fs.readdir(galerieDir)
|
|
|
|
// Filtere nur Bilddateien
|
|
const erlaubteExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg']
|
|
const bilder = dateien.filter(datei => {
|
|
const ext = path.extname(datei).toLowerCase()
|
|
return erlaubteExtensions.includes(ext)
|
|
})
|
|
|
|
// Erstelle Bildobjekte mit Titel basierend auf Dateiname
|
|
return bilder.map(filename => {
|
|
const nameWithoutExt = path.parse(filename).name
|
|
const title = nameWithoutExt
|
|
.replace(/[-_]/g, ' ')
|
|
.replace(/\b\w/g, l => l.toUpperCase())
|
|
|
|
return {
|
|
filename,
|
|
title
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error('Fehler beim Lesen der Galerie:', error)
|
|
return []
|
|
}
|
|
})
|