132 lines
3.8 KiB
Markdown
132 lines
3.8 KiB
Markdown
# Beisel Rallye Graz 🍺
|
|
|
|
## Projektübersicht
|
|
|
|
Interaktive Website für eine Bier-Rallye durch 17 Grazer Bezirke. Teilnehmende tragen bei jedem besuchten Bezirk das entsprechende Beisel (Bierlokal) ein und verfolgen ihren Fortschritt.
|
|
|
|
### Konzept
|
|
- **Ziel:** Alle 17 Grazer Bezirke besuchen
|
|
- **Aktivität:** Für jeden Bezirk ein lokales Beisel finden und eintragen
|
|
- **Zeitrahmen:** 24 Stunden Rallye
|
|
- **Multi-User:** Mehrere Teilnehmer können parallel teilnehmen
|
|
|
|
## Technologie-Stack
|
|
|
|
- **Backend:** Express.js (Node.js)
|
|
- **Frontend:** EJS Templates + Vanilla JavaScript
|
|
- **Datenbank:** SQLite (beisel_rally.db)
|
|
- **Styling:** Custom CSS mit Wirtshaus-Theme
|
|
- **Deployment:** Nginx Reverse Proxy auf `aufeins.click.jetzt`
|
|
|
|
## Architektur
|
|
|
|
```
|
|
beisel-rally/
|
|
├── index.js # Express Server (Port 8083)
|
|
├── package.json # Dependencies & Scripts
|
|
├── beisel_rally.db # SQLite Datenbank
|
|
├── server.log # Laufzeit-Logs
|
|
├── PROJECT.md # Diese Dokumentation
|
|
├── public/
|
|
│ └── css/
|
|
│ └── style.css # Responsive Styling
|
|
└── views/
|
|
└── index.ejs # Haupttemplate mit Client-Side Logic
|
|
```
|
|
|
|
## Datenbank-Design
|
|
|
|
### Tabelle: `rally_logs`
|
|
```sql
|
|
CREATE TABLE rally_logs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_name TEXT NOT NULL,
|
|
district TEXT NOT NULL,
|
|
beisel_name TEXT NOT NULL,
|
|
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
**Zweck:** Server-seitige Speicherung aller Rallye-Einträge für persistente Multi-User-Fähigkeit.
|
|
|
|
## API-Endpunkte (geplant)
|
|
|
|
### Aktuelle Situation
|
|
Derzeit wird **nur localStorage** im Browser genutzt. Die SQLite-Datenbank ist vorhanden, wird aber nicht integriert.
|
|
|
|
### Zu implementierende Endpunkte:
|
|
- `POST /api/visit` - Neuen Bezirk besuchen
|
|
- `GET /api/status/:username` - Fortschritt abrufen
|
|
- `GET /api/all-users` - Alle Teilnehmer anzeigen
|
|
- `DELETE /api/reset/:username` - Reset für User
|
|
|
|
## Deployment
|
|
|
|
### Nginx Konfiguration
|
|
```nginx
|
|
server {
|
|
listen 443 ssl;
|
|
server_name aufeins.click.jetzt;
|
|
|
|
ssl_certificate /etc/letsencrypt/live/aufeins.click.jetzt/fullchain.pem;
|
|
ssl_certificate_key /etc/letsencrypt/live/aufeins.click.jetzt/privkey.pem;
|
|
|
|
location / {
|
|
proxy_pass http://192.168.0.187:8083;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
}
|
|
}
|
|
```
|
|
|
|
### Server Starten
|
|
```bash
|
|
cd /home/claw/.openclaw/agents/wisp/workspace/beisel-rally
|
|
node index.js
|
|
# Server läuft auf http://localhost:8083
|
|
```
|
|
|
|
## Entwicklungs-Status
|
|
|
|
### ✅ Abgeschlossen
|
|
- Grundlegende Frontend-Struktur
|
|
- Responsive Design mit Mobile-Support
|
|
- User-Auswahl und -Verwaltung (localStorage)
|
|
- Fortschrittsanzeige
|
|
- Wirtshaus-Theme Implementierung
|
|
|
|
### ❌ Offene Punkte
|
|
1. **SQLite-Integration** - API-Endpunkte für Datenbank-Zugriff
|
|
2. **Server-Datenpersistenz** - localStorage → Server-Side Storage
|
|
3. **Deployment** - Backend-Server auf 192.168.0.187:8083 starten
|
|
4. **Sicherheit** - Input Validation, Rate Limiting
|
|
5. **Export/Import** - Backup-Funktionalität
|
|
|
|
## Nächste Schritte
|
|
|
|
### Kurzfristig (Prio 1)
|
|
- [ ] API-Endpunkte für SQLite-Datenbank implementieren
|
|
- [ ] Client-Seite anpassen um API zu nutzen
|
|
- [ ] Server starten und testen
|
|
|
|
### Mittelfristig (Prio 2)
|
|
- [ ] Authentifizierung hinzufügen
|
|
- [ ] Leaderboard implementieren
|
|
- [ ] Export/Import Funktionalität
|
|
|
|
### Langfristig (Prio 3)
|
|
- [ ] Mobile App (Progressive Web App)
|
|
- [ ] Social Features (Teilen, Einladungen)
|
|
- [ ] Anbindung an bestehende Beisel-Datenbank
|
|
|
|
## Kontakt & Credits
|
|
|
|
Projekt erstellt von Gregor. Entwicklung durch Wisp (AI Coding Agent).
|
|
|
|
**Domain:** aufeins.click.jetzt
|
|
**Server:** 192.168.0.187:8083
|
|
**Gitea:** http://gitea.click.jetzt:3000/clawdia/beisel-rally
|
|
|
|
---
|
|
*Prost! 🍻*
|