128 lines
5.4 KiB
Markdown
128 lines
5.4 KiB
Markdown
# Date-Wizard 💕
|
||
|
||
Eine spielerische Web-App ("Choose Your Own Adventure") zum Planen gemeinsamer Dates – mit mobilem Design, dynamischen Aktivitäten & Terminen sowie einem Go-Microservice zum E-Mail-Versand der Reservierung.
|
||
|
||
---
|
||
|
||
## 📁 Projektstruktur
|
||
|
||
```text
|
||
datetest/
|
||
├── config/ # Persistente JSON-Konfiguration und Buchungen
|
||
│ ├── appsettings.json # Admin-Passwort und optionale Namen
|
||
│ ├── activities.json # Aktivitäten
|
||
│ ├── dates_available.json # Verfügbare Termine
|
||
│ └── dates_booked.json # Strukturierte Buchungen
|
||
├── public/ # Statische Webseiten & Assets
|
||
│ ├── index.html # Startseite ("Willst du mit mir gehen?")
|
||
│ ├── datetime.html/.js # Datumsauswahl (Kalender)
|
||
│ ├── activity.html/.js # Aktivitätsauswahl
|
||
│ ├── name.html/.js # Namensauswahl ("Wer bist du?")
|
||
│ └── checkout.html/.js # Zusammenfassung & Bestätigung
|
||
├── main.go # Go-Microservice (HTTP-Server & SMTP E-Mail)
|
||
├── go.mod # Go-Moduldefinition
|
||
├── Dockerfile # Multi-Stage Dockerfile (Alpine Runtime)
|
||
├── docker-compose.yml # Docker-Compose mit Traefik Labels
|
||
├── .env.example # Vorlage für Umgebungsvariablen
|
||
└── .env # Lokale/Produktive Umgebungsvariablen (nicht ins Git committen)
|
||
```
|
||
|
||
---
|
||
|
||
## ⚙️ Konfiguration
|
||
|
||
### 1. E-Mail & Server `.env` anlegen
|
||
|
||
Kopiere `.env.example` zu `.env`:
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
```
|
||
|
||
Trage in der `.env` deine Server- und SMTP-Zugangsdaten ein:
|
||
|
||
| Variable | Beschreibung | Beispiel |
|
||
| :--- | :--- | :--- |
|
||
| `PORT` | HTTP-Port des Go-Servers | `8080` |
|
||
| `WEB_DIR` | Verzeichnis der statischen Assets | `public` |
|
||
| `SMTP_HOST` | Postausgangsserver (SMTP) | `mail.example.com` |
|
||
| `SMTP_PORT` | SMTP-Port (Standard meist 587 oder 465) | `587` |
|
||
| `SMTP_USER` | Benutzername / E-Mail für SMTP-Auth | `absender@example.com` |
|
||
| `SMTP_PASS` | Passwort des SMTP-Kontos | `secretpassword` |
|
||
| `TO_EMAIL` | Ziel-Adresse für eingegangene Date-Anfragen | `ziel@example.com` |
|
||
| `FROM_EMAIL` | Absender-Adresse für die Benachrichtigung | `absender@example.com` |
|
||
|
||
*(Hinweis: Wenn `SMTP_HOST` oder `TO_EMAIL` leer bleiben, läuft der Server im Testmodus ohne E-Mail-Versand.)*
|
||
|
||
### 2. Einstellungen und Daten
|
||
|
||
Die persistenten Daten liegen in getrennten JSON-Dateien:
|
||
|
||
- **`adminPassword`**: Passwort für die Terminverwaltung unter `/admin`. Ändere den Standardwert `change-me`, bevor du die Anwendung veröffentlichst.
|
||
- **`activities.json`**: Liste von Objekten mit `name`, `icon` (Unicode Emoji), `type` (`short`, `long` oder `custom`) und optional `disabled` (`true` blendet die Aktivität vorübergehend aus).
|
||
- **`dates_available.json`**: Liste von verfügbaren Tagen mit `date` (`YYYY-MM-DD`) und `type` (`short` oder `long`).
|
||
- **`dates_booked.json`**: Strukturierte Buchungen mit `bookedAt`, `date`, `dateType`, `name` und den ausgewählten Aktivitäten inklusive Name, Typ und Icon.
|
||
- **`names`**: Optional vordefinierte Namen zur Auswahl (ist die Liste leer, wird die Namensseite übersprungen).
|
||
|
||
Die Termin- und Aktivitätenlisten lassen sich über die passwortgeschützte Verwaltung unter `http://localhost:8080/admin` bearbeiten. Das Passwort bleibt dabei auf dem Server und wird nicht an Besucher ausgeliefert.
|
||
|
||
Bei Docker Compose wird `/docker/data/date` als ein Volume nach `/app/config` eingebunden. Die vier JSON-Dateien müssen dort vor dem ersten Start vorhanden sein. Du kannst sie aus dem Projektordner initialisieren:
|
||
|
||
```bash
|
||
mkdir -p /docker/data/date
|
||
cp config/appsettings.json /docker/data/date/appsettings.json
|
||
cp config/activities.json /docker/data/date/activities.json
|
||
cp config/dates_available.json /docker/data/date/dates_available.json
|
||
cp config/dates_booked.json /docker/data/date/dates_booked.json
|
||
```
|
||
|
||
Wenn bisher `/docker/data/date/booked_dates.json` verwendet wurde, übernimm die alten Buchungsdaten zuerst in `dates_booked.json`. Das neue Format speichert Buchungen als Objekte statt als reine Datumsstrings.
|
||
|
||
---
|
||
|
||
## 🚀 Inbetriebnahme
|
||
|
||
### Option A: Mit Docker Compose (Empfohlen)
|
||
|
||
1. `.env` wie oben beschrieben anpassen.
|
||
2. Container erstellen und starten:
|
||
|
||
```bash
|
||
docker-compose up -d --build
|
||
```
|
||
|
||
3. Die Anwendung ist unter `http://localhost:8080` erreichbar.
|
||
|
||
#### Traefik / Reverse Proxy
|
||
|
||
`docker-compose.yml` enthält bereits Traefik-Labels. Passe bei Bedarf die Domain an:
|
||
|
||
```yaml
|
||
- "traefik.http.routers.date-wizard.rule=Host(`date.deine-domain.de`)"
|
||
```
|
||
|
||
---
|
||
|
||
### Option B: Direkt mit Go (Lokal)
|
||
|
||
#### Voraussetzungen
|
||
- Installed Go SDK (Version 1.22 oder neuer)
|
||
|
||
1. Abhängigkeiten prüfen & kompilieren:
|
||
|
||
```bash
|
||
go run main.go
|
||
```
|
||
|
||
2. Die Anwendung startet auf dem in `.env` definierten Port (z. B. `http://localhost:8080`).
|
||
|
||
---
|
||
|
||
## 📱 Ablauf der Anwendung
|
||
|
||
1. **Startseite (`index.html`)**: Spielerische Frage mit Ja/Nein-Interaktion.
|
||
2. **Datumsauswahl (`datetime.html`)**: Interaktiver Kalender mit Markierung von verfügbaren Tagen (`short`/`long`).
|
||
3. **Aktivitätsauswahl (`activity.html`)**: Auswahl passender Aktivitäten je nach verbleibender Zeit am gewählten Tag.
|
||
4. **Namensauswahl (`name.html`)**: Abfrage "Wer bist du?".
|
||
5. **Checkout & Bestätigung (`checkout.html`)**: Finale Übersicht und Absenden der Reservierung (überträgt Daten an `/api/submit` und löst den E-Mail-Versand aus).
|