From 897597bb54d8ddba5044f980441ce5446fb3e71d Mon Sep 17 00:00:00 2001 From: cay Date: Fri, 27 Mar 2026 10:17:15 +0000 Subject: [PATCH] Initial commit: Wachplan v1.1 --- .gitignore | 4 + README.md | 325 +++++++++ app.js | 73 ++ config/database.js | 16 + database/schema.sql | 85 +++ ecosystem.config.js | 24 + middleware/auth.js | 8 + nginx/plusfit24.conf | 28 + package.json | 22 + public/css/style.css | 819 ++++++++++++++++++++++ public/pdfs/Einverstaendniserklaerung.pdf | Bin 0 -> 92896 bytes routes/admin.js | 170 +++++ routes/api.js | 105 +++ routes/index.js | 40 ++ views/admin/dashboard.ejs | 385 ++++++++++ views/admin/login.ejs | 40 ++ views/error.ejs | 20 + views/index.ejs | 76 ++ views/signup.ejs | 473 +++++++++++++ views/success.ejs | 30 + 20 files changed, 2743 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app.js create mode 100644 config/database.js create mode 100644 database/schema.sql create mode 100644 ecosystem.config.js create mode 100644 middleware/auth.js create mode 100644 nginx/plusfit24.conf create mode 100644 package.json create mode 100644 public/css/style.css create mode 100644 public/pdfs/Einverstaendniserklaerung.pdf create mode 100644 routes/admin.js create mode 100644 routes/api.js create mode 100644 routes/index.js create mode 100644 views/admin/dashboard.ejs create mode 100644 views/admin/login.ejs create mode 100644 views/error.ejs create mode 100644 views/index.ejs create mode 100644 views/signup.ejs create mode 100644 views/success.ejs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..daf1dd0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.env +*.log +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..0c3249c --- /dev/null +++ b/README.md @@ -0,0 +1,325 @@ +# PlusFit24 – Mitgliedschafts-Anmeldesystem +## Vollständige Installationsanleitung + +--- + +## 🏗️ Übersicht deiner Server-Infrastruktur + +``` +Internet + │ + ▼ +NGINX (192.168.0.157) ← SSL Zertifikat hier + │ plusfit24.software-joksch.com + │ Proxy → Port 3100 + ▼ +Node.js App Server (192.168.0.163:3100) + │ + ▼ +MariaDB (85.215.63.122:3306) +``` + +--- + +## SCHRITT 1: Datenbank einrichten (MariaDB 85.215.63.122) + +Verbinde dich mit deinem MariaDB Server: + +```bash +mysql -h 85.215.63.122 -u root -p +``` + +Führe das Schema aus: + +```bash +mysql -h 85.215.63.122 -u root -p < database/schema.sql +``` + +Erstelle einen dedizierten DB-User (sicherer als root): + +```sql +CREATE USER 'plusfit24'@'192.168.0.163' IDENTIFIED BY 'DEIN_SICHERES_PASSWORT'; +GRANT ALL PRIVILEGES ON plusfit24.* TO 'plusfit24'@'192.168.0.163'; +FLUSH PRIVILEGES; +``` + +⚠️ **Wichtig:** Ersetze `DEIN_SICHERES_PASSWORT` mit einem echten starken Passwort! + +--- + +## SCHRITT 2: App auf Node.js Server einrichten (192.168.0.163) + +### 2.1 Projekt auf den Server übertragen + +**Option A – via Gitea (empfohlen):** +```bash +# Auf dem Gitea-Server (192.168.0.221): Neues Repository anlegen +# Dann auf dem App-Server: +ssh user@192.168.0.163 +cd /var/www +git clone http://192.168.0.221/dein-user/plusfit24.git +cd plusfit24 +``` + +**Option B – direkt per SCP:** +```bash +# Von deinem lokalen Rechner: +scp -r /pfad/zu/plusfit24 user@192.168.0.163:/var/www/plusfit24 +``` + +### 2.2 Node.js installieren (falls noch nicht vorhanden) + +```bash +# Node.js 20 LTS installieren +curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - +sudo apt-get install -y nodejs + +# Version prüfen +node --version # sollte v20.x.x zeigen +npm --version +``` + +### 2.3 Abhängigkeiten installieren + +```bash +cd /var/www/plusfit24 +npm install +``` + +### 2.4 Umgebungsvariablen konfigurieren + +```bash +cp .env.example .env # oder direkt: +nano .env +``` + +Fülle die `.env` aus: + +```env +DB_HOST=85.215.63.122 +DB_PORT=3306 +DB_USER=plusfit24 +DB_PASSWORD=DEIN_SICHERES_PASSWORT ← gleich wie in Schritt 1 +DB_NAME=plusfit24 + +SESSION_SECRET=ein-sehr-langer-zufaelliger-string-hier-aendern + +ADMIN_USER=admin +ADMIN_PASSWORD=DeinSicheresAdminPasswort123! + +PORT=3100 +``` + +🔐 **Tipp:** Session Secret generieren: +```bash +node -e "console.log(require('crypto').randomBytes(48).toString('hex'))" +``` + +### 2.5 Test-Start (einmalig zum Prüfen) + +```bash +node app.js +# Ausgabe: 🚀 PlusFit24 Server läuft auf Port 3100 +# Ausgabe: ✅ Admin Account erstellt: admin +``` + +Mit Ctrl+C stoppen. + +--- + +## SCHRITT 3: PM2 installieren (Prozess-Manager) + +```bash +# PM2 global installieren +sudo npm install -g pm2 + +# App mit PM2 starten +cd /var/www/plusfit24 +pm2 start ecosystem.config.js + +# Status prüfen +pm2 status + +# Logs ansehen +pm2 logs plusfit24 + +# PM2 beim Systemstart automatisch starten +pm2 startup +# Den angezeigten Befehl kopieren und ausführen, dann: +pm2 save +``` + +**Wichtige PM2 Befehle:** +```bash +pm2 restart plusfit24 # App neu starten +pm2 stop plusfit24 # App stoppen +pm2 logs plusfit24 # Live-Logs anzeigen +pm2 monit # Monitor-Ansicht +``` + +--- + +## SCHRITT 4: NGINX konfigurieren (192.168.0.157) + +### 4.1 NGINX Konfiguration kopieren + +```bash +# Auf dem NGINX Server einloggen +ssh user@192.168.0.157 + +# Konfigurationsdatei erstellen +sudo nano /etc/nginx/sites-available/plusfit24 +``` + +Inhalt aus der Datei `nginx/plusfit24.conf` einfügen. + +⚠️ **SSL Pfade anpassen!** Suche im File nach: +``` +ssl_certificate /etc/ssl/certs/... +ssl_certificate_key /etc/ssl/private/... +``` + +Passe die Pfade auf deine tatsächlichen Zertifikat-Dateien an. + +### 4.2 Site aktivieren + +```bash +# Symlink erstellen +sudo ln -s /etc/nginx/sites-available/plusfit24 /etc/nginx/sites-enabled/ + +# Konfiguration prüfen +sudo nginx -t + +# Bei "syntax is ok": NGINX neu laden +sudo systemctl reload nginx +``` + +### 4.3 Firewall prüfen (falls aktiv) + +```bash +# Auf App-Server: Port 3100 für NGINX-Server freigeben +sudo ufw allow from 192.168.0.157 to any port 3100 +``` + +--- + +## SCHRITT 5: DNS einrichten + +Bei deinem DNS-Anbieter einen A-Record erstellen: + +``` +Typ: A +Name: plusfit24.software-joksch.com +Ziel: [Öffentliche IP deines NGINX-Servers] +TTL: 300 +``` + +--- + +## SCHRITT 6: Testen + +1. **Datenbank-Verbindung:** `node -e "require('./config/database').query('SELECT 1').then(()=>console.log('DB OK')).catch(console.error)"` + +2. **App läuft:** `pm2 status` → Status sollte "online" sein + +3. **Webseite:** https://plusfit24.software-joksch.com aufrufen + +4. **Admin-Bereich:** https://plusfit24.software-joksch.com/admin/login + - Benutzername: `admin` (oder was du in .env gesetzt hast) + - Passwort: aus der `.env` Datei + +--- + +## 📋 Admin-Bereich Anleitung + +### Tarife verwalten +- **Neuer Tarif:** Button "+ Neuer Tarif" → Formular ausfüllen +- **Deaktivieren:** Tarif-Card → "⏸ Deaktivieren" (Tarif bleibt erhalten, erscheint nicht mehr auf der Webseite) +- **Preis ändern:** Alten Tarif deaktivieren → Neuen Tarif mit neuem Preis erstellen +- **Löschen:** Nur möglich wenn keine Mitglieder den Tarif haben + +### Mitglieder ansehen +- Vollständige Liste aller angemeldeten Mitglieder +- Suchfunktion nach Name oder E-Mail +- ⚠️-Symbol zeigt Minderjährige + +### Passwort ändern +- Admin → Einstellungen → Passwort ändern + +--- + +## 🔧 Troubleshooting + +**App startet nicht:** +```bash +pm2 logs plusfit24 --lines 50 +# Häufige Ursachen: DB nicht erreichbar, .env fehlt, Port belegt +``` + +**DB-Verbindungsfehler:** +```bash +# Verbindung testen +mysql -h 85.215.63.122 -u plusfit24 -p plusfit24 +``` + +**NGINX 502 Bad Gateway:** +```bash +# Prüfen ob App läuft +pm2 status +# Prüfen ob Port erreichbar +curl http://192.168.0.163:3100 +``` + +**Nach Code-Updates:** +```bash +cd /var/www/plusfit24 +git pull # falls Gitea genutzt +npm install # falls neue Dependencies +pm2 restart plusfit24 +``` + +--- + +## 📁 Projektstruktur + +``` +plusfit24/ +├── app.js # Haupt-Einstiegspunkt +├── package.json +├── .env # ⚠️ Nicht in Git einchecken! +├── ecosystem.config.js # PM2 Konfiguration +├── config/ +│ └── database.js # DB-Verbindung +├── middleware/ +│ └── auth.js # Admin-Authentifizierung +├── routes/ +│ ├── index.js # Öffentliche Routen (Tarife, Anmeldung) +│ ├── admin.js # Admin-Routen +│ └── api.js # API (E-Mail-Prüfung, Formular-Submit) +├── views/ +│ ├── index.ejs # Tarif-Auswahl +│ ├── signup.ejs # Anmelde-Formular (4 Schritte) +│ ├── success.ejs # Erfolgsseite +│ ├── error.ejs # Fehlerseite +│ └── admin/ +│ ├── login.ejs # Admin Login +│ └── dashboard.ejs # Admin Dashboard +├── public/ +│ ├── css/style.css # Alle Styles +│ └── pdfs/ +│ └── Einverstaendniserklaerung.pdf +├── database/ +│ └── schema.sql # Datenbank-Schema +└── nginx/ + └── plusfit24.conf # NGINX Konfiguration +``` + +--- + +## 🔐 Sicherheitshinweise + +1. `.env` niemals in Git einchecken (ist in `.gitignore`) +2. Starke Passwörter für DB und Admin verwenden +3. DB-User nur von App-Server-IP Zugriff erlauben +4. SESSION_SECRET muss ein langer, zufälliger String sein +5. Admin-URL ist `/admin/login` – nicht öffentlich bewerben diff --git a/app.js b/app.js new file mode 100644 index 0000000..cf2da39 --- /dev/null +++ b/app.js @@ -0,0 +1,73 @@ +require('dotenv').config(); +const express = require('express'); +const session = require('express-session'); +const path = require('path'); +const bcrypt = require('bcryptjs'); +const db = require('./config/database'); + +const app = express(); + +// View Engine +app.set('view engine', 'ejs'); +app.set('views', path.join(__dirname, 'views')); + +// Static Files +app.use(express.static(path.join(__dirname, 'public'))); + +// Body Parser +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); + +// Session +app.use(session({ + secret: process.env.SESSION_SECRET || 'plusfit24-secret', + resave: false, + saveUninitialized: false, + cookie: { + secure: false, // auf true setzen wenn HTTPS direkt (nicht via Proxy) + maxAge: 24 * 60 * 60 * 1000 // 24 Stunden + } +})); + +// Routen +const indexRouter = require('./routes/index'); +const adminRouter = require('./routes/admin'); +const apiRouter = require('./routes/api'); + +app.use('/', indexRouter); +app.use('/admin', adminRouter); +app.use('/api', apiRouter); + +// 404 Handler +app.use((req, res) => { + res.status(404).render('error', { message: 'Seite nicht gefunden' }); +}); + +// Fehler Handler +app.use((err, req, res, next) => { + console.error(err.stack); + res.status(500).render('error', { message: 'Ein Fehler ist aufgetreten' }); +}); + +// Admin Account beim Start erstellen falls keiner existiert +async function initAdmin() { + try { + const [rows] = await db.query('SELECT COUNT(*) as count FROM admins'); + if (rows[0].count === 0) { + const hash = await bcrypt.hash(process.env.ADMIN_PASSWORD || 'Admin1234!', 12); + await db.query( + 'INSERT INTO admins (username, password_hash) VALUES (?, ?)', + [process.env.ADMIN_USER || 'admin', hash] + ); + console.log('✅ Admin Account erstellt:', process.env.ADMIN_USER || 'admin'); + } + } catch (err) { + console.error('❌ Fehler beim Erstellen des Admin Accounts:', err.message); + } +} + +const PORT = process.env.PORT || 3100; +app.listen(PORT, async () => { + console.log(`🚀 PlusFit24 Server läuft auf Port ${PORT}`); + await initAdmin(); +}); diff --git a/config/database.js b/config/database.js new file mode 100644 index 0000000..cf8b0e7 --- /dev/null +++ b/config/database.js @@ -0,0 +1,16 @@ +require('dotenv').config(); +const mysql = require('mysql2/promise'); + +const pool = mysql.createPool({ + host: process.env.DB_HOST, + port: process.env.DB_PORT || 3306, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, + charset: 'utf8mb4' +}); + +module.exports = pool; diff --git a/database/schema.sql b/database/schema.sql new file mode 100644 index 0000000..e8be017 --- /dev/null +++ b/database/schema.sql @@ -0,0 +1,85 @@ +-- ============================================ +-- PlusFit24 Datenbank Schema +-- Auf dem MariaDB Server ausführen +-- ============================================ + +CREATE DATABASE IF NOT EXISTS plusfit24 + CHARACTER SET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +USE plusfit24; + +-- Kategorien Tabelle +CREATE TABLE IF NOT EXISTS categories ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +INSERT INTO categories (name) VALUES +('Single'), +('Schüler / Studenten / Vereine'), +('Family'), +('Sonstige'); + +-- Tarife Tabelle +CREATE TABLE IF NOT EXISTS tariffs ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + category_id INT, + duration_months INT NOT NULL, + price_monthly DECIMAL(10,2) NOT NULL, + start_package_price DECIMAL(10,2) DEFAULT 35.00, + description TEXT, + active TINYINT(1) DEFAULT 1, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL +); + +INSERT INTO tariffs (name, category_id, duration_months, price_monthly, start_package_price, description) VALUES +('Single 12 Monate', 1, 12, 29.95, 35.00, 'Einzelmitgliedschaft für 12 Monate'), +('Single 24 Monate', 1, 24, 19.95, 35.00, 'Einzelmitgliedschaft für 24 Monate'), +('Schüler - Studenten - Vereine 12 Monate', 2, 12, 28.95, 35.00, 'Ermäßigter Tarif'), +('Family 24 Monate', 3, 24, 49.95, 35.00, 'Familientarif für 24 Monate'); + +-- Mitgliedschaften Tabelle +CREATE TABLE IF NOT EXISTS memberships ( + id INT AUTO_INCREMENT PRIMARY KEY, + tariff_id INT NOT NULL, + salutation VARCHAR(20) NOT NULL, + title VARCHAR(50), + first_name VARCHAR(100) NOT NULL, + last_name VARCHAR(100) NOT NULL, + birth_date DATE NOT NULL, + email VARCHAR(255) NOT NULL, + phone VARCHAR(50), + street VARCHAR(200) NOT NULL, + address_addition VARCHAR(200), + zip VARCHAR(10) NOT NULL, + city VARCHAR(100) NOT NULL, + bank_name VARCHAR(200), + account_holder VARCHAR(200), + iban VARCHAR(34), + sepa_accepted TINYINT(1) DEFAULT 0, + agb_accepted TINYINT(1) DEFAULT 0, + datenschutz_accepted TINYINT(1) DEFAULT 0, + data_correct TINYINT(1) DEFAULT 0, + guardian_consent TINYINT(1) DEFAULT 0, + is_minor TINYINT(1) DEFAULT 0, + status VARCHAR(20) DEFAULT 'active', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (tariff_id) REFERENCES tariffs(id) +); + +-- Admin Tabelle +CREATE TABLE IF NOT EXISTS admins ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(100) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX idx_memberships_email ON memberships(email); +CREATE INDEX idx_memberships_status ON memberships(status); +CREATE INDEX idx_tariffs_active ON tariffs(active); diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 0000000..514ca85 --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,24 @@ +// PM2 Ecosystem Konfiguration +// Starten mit: pm2 start ecosystem.config.js + +module.exports = { + apps: [ + { + name: 'plusfit24', + script: 'app.js', + cwd: '/var/www/plusfit24', + instances: 1, + autorestart: true, + watch: false, + max_memory_restart: '300M', + env: { + NODE_ENV: 'production', + PORT: 3100 + }, + error_file: '/var/log/pm2/plusfit24-error.log', + out_file: '/var/log/pm2/plusfit24-out.log', + log_date_format: 'YYYY-MM-DD HH:mm:ss', + time: true + } + ] +}; diff --git a/middleware/auth.js b/middleware/auth.js new file mode 100644 index 0000000..1d98d0b --- /dev/null +++ b/middleware/auth.js @@ -0,0 +1,8 @@ +function requireAdmin(req, res, next) { + if (req.session && req.session.adminId) { + return next(); + } + res.redirect('/admin/login'); +} + +module.exports = { requireAdmin }; diff --git a/nginx/plusfit24.conf b/nginx/plusfit24.conf new file mode 100644 index 0000000..4520884 --- /dev/null +++ b/nginx/plusfit24.conf @@ -0,0 +1,28 @@ +# ===================================================== +# NGINX Konfiguration für plusfit24.software-joksch.com +# Datei speichern unter: /etc/nginx/sites-available/plusfit24 +# Symlink: ln -s /etc/nginx/sites-available/plusfit24 /etc/nginx/sites-enabled/ +# ===================================================== + +server { + listen 443 ssl http2; + server_name plusfit24.software-joksch.com; + + # SSL – gleiche Zertifikate wie deine anderen vHosts + ssl_certificate /etc/nginx/ssl/fullchain.pem; + ssl_certificate_key /etc/nginx/ssl/software-joksch.com.key; + + client_max_body_size 10M; + + location / { + proxy_pass http://192.168.0.163:3100; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_redirect off; + proxy_read_timeout 3600; + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1b5db89 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "plusfit24-signup", + "version": "1.0.0", + "description": "PlusFit24 Mitgliedschaft Anmeldesystem", + "main": "app.js", + "scripts": { + "start": "node app.js", + "dev": "nodemon app.js" + }, + "dependencies": { + "express": "^4.18.2", + "express-session": "^1.17.3", + "ejs": "^3.1.9", + "mysql2": "^3.6.0", + "bcryptjs": "^2.4.3", + "dotenv": "^16.3.1", + "dns": "^0.2.2" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } +} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 0000000..ff01d5d --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,819 @@ +/* ========================================= + PlusFit24 – Stylesheet + ========================================= */ + +:root { + --primary: #2d2dcc; + --primary-dark: #1a1a9e; + --accent: #5555ff; + --text: #1a1a2e; + --text-muted: #6b7280; + --border: #e2e4ed; + --bg: #f8f9ff; + --white: #ffffff; + --success: #16a34a; + --error: #dc2626; + --warning: #d97706; + --radius: 12px; + --shadow: 0 2px 16px rgba(45,45,204,0.08); +} + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +body { + font-family: 'Outfit', sans-serif; + color: var(--text); + background: var(--white); + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* ---- HEADER ---- */ +.site-header { + border-bottom: 1px solid var(--border); + padding: 16px 0; + background: var(--white); + position: sticky; + top: 0; + z-index: 100; +} +.header-inner { + max-width: 1100px; + margin: 0 auto; + padding: 0 24px; +} +.logo { + font-size: 1.6rem; + font-weight: 800; + color: var(--text); + letter-spacing: -0.5px; +} +.logo span { color: var(--primary); } + +/* ---- PROGRESS NAV ---- */ +.progress-nav { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 20px 24px; + border-bottom: 1px solid var(--border); + flex-wrap: wrap; +} +.step { + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 1.5px; + color: var(--text-muted); + text-transform: uppercase; + padding: 4px 0; + position: relative; + cursor: default; +} +.step.active { + color: var(--primary); + border-bottom: 2px solid var(--primary); +} +.step.done { color: var(--success); } +.step-dot { + width: 20px; + height: 1px; + background: var(--border); +} + +/* ---- TARIF SECTION ---- */ +.tarif-section { + max-width: 1000px; + margin: 0 auto; + padding: 48px 24px; + flex: 1; +} +.page-title { + font-size: 2.5rem; + font-weight: 800; + text-align: center; + margin-bottom: 40px; + color: var(--text); +} +.page-title.italic { font-style: italic; font-weight: 400; font-size: 1.5rem; } + +.tarif-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 24px; +} +.tarif-card { + border: 1.5px solid var(--border); + border-radius: 20px; + overflow: hidden; + transition: box-shadow 0.2s, transform 0.2s; +} +.tarif-card:hover { + box-shadow: var(--shadow); + transform: translateY(-2px); +} +.tarif-card-inner { padding: 28px 24px; } +.tarif-badge { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.8rem; + color: var(--text-muted); + margin-bottom: 12px; +} +.tarif-icon { font-size: 1rem; } +.tarif-name { + font-size: 1.5rem; + font-weight: 700; + margin-bottom: 16px; + line-height: 1.2; +} +.tarif-feature { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.9rem; + color: var(--text-muted); + margin-bottom: 20px; +} +.tarif-price { + display: flex; + align-items: baseline; + gap: 4px; + margin-bottom: 24px; +} +.price-amount { + font-size: 1.8rem; + font-weight: 800; + color: var(--primary); +} +.price-period { font-size: 0.9rem; color: var(--text-muted); } +.no-tarifs { + grid-column: 1/-1; + text-align: center; + color: var(--text-muted); + padding: 60px 20px; +} + +/* ---- BUTTONS ---- */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 12px 24px; + border-radius: 10px; + font-family: 'Outfit', sans-serif; + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + border: 2px solid transparent; + text-decoration: none; + transition: all 0.2s; + white-space: nowrap; +} +.btn-primary { + background: var(--primary); + color: var(--white); + border-color: var(--primary); +} +.btn-primary:hover { background: var(--primary-dark); border-color: var(--primary-dark); } +.btn-outline { + background: transparent; + color: var(--text); + border-color: var(--border); +} +.btn-outline:hover { border-color: var(--primary); color: var(--primary); } +.btn-full { width: 100%; } +.btn-success { background: var(--success); color: white; border-color: var(--success); } +.btn-warning { background: var(--warning); color: white; border-color: var(--warning); } +.btn-danger { background: var(--error); color: white; border-color: var(--error); } +.btn-sm { padding: 6px 12px; font-size: 0.82rem; border-radius: 7px; } +.btn-submit { + width: 100%; + padding: 18px; + background: var(--primary); + color: white; + border: none; + border-radius: 12px; + font-size: 1.1rem; + font-weight: 700; + cursor: pointer; + transition: background 0.2s; +} +.btn-submit:hover { background: var(--primary-dark); } +.btn-submit:disabled { opacity: 0.6; cursor: not-allowed; } + +/* ---- SIGNUP FORM ---- */ +.signup-main { flex: 1; } +.signup-container { + max-width: 680px; + margin: 0 auto; + padding: 32px 24px 60px; +} +.form-step { display: none; } +.form-step.active { display: block; } + +.step-title { + font-size: 2rem; + font-weight: 800; + text-align: center; + margin-bottom: 8px; +} +.step-title.italic { font-style: italic; font-weight: 400; font-size: 1.3rem; } +.step-subtitle { + text-align: center; + color: var(--text-muted); + margin-bottom: 32px; + font-style: italic; +} + +/* Anrede Buttons */ +.salutation-group { + display: flex; + gap: 12px; + margin-bottom: 28px; + flex-wrap: wrap; +} +.sal-btn { + flex: 1; + min-width: 100px; + padding: 12px; + border: 1.5px solid var(--border); + border-radius: 10px; + background: white; + font-family: 'Outfit', sans-serif; + font-weight: 600; + font-size: 0.9rem; + cursor: pointer; + transition: all 0.2s; +} +.sal-btn:hover { border-color: var(--primary); color: var(--primary); } +.sal-btn.active { border-color: var(--primary); background: var(--primary); color: white; } + +/* Form Groups */ +.form-group { margin-bottom: 16px; } +.form-group label { + display: block; + font-size: 0.88rem; + font-weight: 600; + margin-bottom: 6px; + color: var(--text); +} +.req { color: var(--error); } +.input-wrap { + display: flex; + align-items: center; + border: 1.5px solid var(--border); + border-radius: 10px; + padding: 0 14px; + background: white; + transition: border-color 0.2s; +} +.input-wrap:focus-within { border-color: var(--primary); } +.input-icon { font-size: 0.9rem; margin-right: 10px; opacity: 0.5; flex-shrink: 0; } +.input-wrap input, +.input-wrap textarea, +.input-wrap select { + flex: 1; + border: none; + outline: none; + padding: 13px 0; + font-family: 'Outfit', sans-serif; + font-size: 0.95rem; + color: var(--text); + background: transparent; +} +.input-wrap input::placeholder { color: #9ca3af; } +.email-status { font-size: 1rem; margin-left: 8px; } +.email-message { font-size: 0.8rem; margin-top: 4px; padding-left: 4px; } +.email-message.error { color: var(--error); } + +/* Checkboxes */ +.checkbox-label { + display: flex; + align-items: flex-start; + gap: 12px; + cursor: pointer; + margin-bottom: 14px; + line-height: 1.5; + font-size: 0.9rem; +} +.checkbox-label input[type="checkbox"] { display: none; } +.checkbox-custom { + width: 22px; + height: 22px; + min-width: 22px; + border: 2px solid var(--border); + border-radius: 5px; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s; + margin-top: 2px; +} +.checkbox-label input:checked + .checkbox-custom { + background: var(--primary); + border-color: var(--primary); +} +.checkbox-label input:checked + .checkbox-custom::after { + content: '✓'; + color: white; + font-size: 0.8rem; + font-weight: 700; +} + +/* SEPA Mandate */ +.sepa-mandate { + background: #f0f0ff; + border: 1.5px solid var(--primary); + border-radius: 10px; + padding: 16px; + margin-bottom: 24px; + font-size: 0.85rem; + line-height: 1.6; +} +.form-label-section { + display: block; + font-weight: 700; + font-size: 0.9rem; + margin-bottom: 12px; + color: var(--text-muted); +} + +/* Step Buttons */ +.step-buttons { + display: flex; + justify-content: center; + gap: 16px; + margin-top: 32px; +} +.step-buttons .btn { min-width: 140px; } + +/* Alerts */ +.alert { + padding: 12px 16px; + border-radius: 8px; + margin-bottom: 16px; + font-size: 0.9rem; +} +.alert-success { background: #dcfce7; color: var(--success); border: 1px solid #bbf7d0; } +.alert-error { background: #fee2e2; color: var(--error); border: 1px solid #fecaca; } +.hidden { display: none !important; } + +/* Warning Box */ +.minor-warning { margin-top: 16px; } +.warning-box { + background: #fffbeb; + border: 1.5px solid var(--warning); + border-radius: 10px; + padding: 16px; + font-size: 0.9rem; +} +.warning-box strong { display: block; margin-bottom: 6px; } +.minor-info-box { + background: #fffbeb; + border: 1.5px solid var(--warning); + border-radius: 10px; + padding: 16px; + margin-bottom: 16px; + font-size: 0.9rem; +} +.minor-info-box strong { display: block; margin-bottom: 8px; } +.minor-info-box p { margin-bottom: 10px; } + +/* ---- ABSCHLUSS ---- */ +.abschluss-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 24px; + margin-bottom: 32px; +} +@media (max-width: 640px) { .abschluss-grid { grid-template-columns: 1fr; } } + +.tarif-summary-card { + border: 1.5px solid var(--border); + border-radius: 16px; + padding: 24px; +} +.summary-badge { + font-size: 0.8rem; + color: var(--text-muted); + margin-bottom: 12px; +} +.tarif-summary-card h3 { font-size: 1.3rem; font-weight: 700; margin-bottom: 16px; } +.summary-feature { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.85rem; + color: var(--text-muted); + margin-bottom: 8px; +} +.summary-price { + display: flex; + align-items: baseline; + gap: 4px; + margin-top: 16px; +} +.price-big { font-size: 2rem; font-weight: 800; color: var(--primary); } + +.final-checks { padding: 4px 0; } +.final-checks h3 { font-size: 1.2rem; font-weight: 700; margin-bottom: 16px; } +.doc-buttons { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 20px; +} +.doc-btn { + padding: 8px 14px; + border: 1.5px solid var(--border); + border-radius: 8px; + font-size: 0.8rem; + font-weight: 600; + text-decoration: none; + color: var(--text); + transition: all 0.2s; + display: inline-block; +} +.doc-btn:hover { border-color: var(--primary); color: var(--primary); } + +.submit-section { text-align: center; padding: 20px 0; } +.submit-notice { font-size: 0.9rem; margin-bottom: 16px; } +.ssl-notice { font-size: 0.8rem; color: var(--text-muted); margin-top: 12px; } + +/* ---- SUCCESS ---- */ +.success-main { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + padding: 40px 24px; +} +.success-card { + text-align: center; + max-width: 480px; + padding: 48px 32px; + border: 1.5px solid var(--border); + border-radius: 20px; +} +.success-icon { font-size: 3rem; margin-bottom: 16px; } +.success-card h1 { font-size: 1.8rem; font-weight: 800; margin-bottom: 12px; } +.success-card p { color: var(--text-muted); margin-bottom: 8px; } +.success-sub { font-size: 0.9rem; margin-bottom: 24px !important; } + +/* ---- FOOTER ---- */ +.site-footer { + text-align: center; + padding: 24px; + border-top: 1px solid var(--border); + font-size: 0.85rem; + color: var(--text-muted); + margin-top: auto; +} +.site-footer a { color: var(--primary); text-decoration: none; } + +/* ================================================ + ADMIN STYLES + ================================================ */ +.admin-body { background: var(--bg); } + +/* Admin Login */ +.admin-login-wrap { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 24px; +} +.admin-login-card { + background: white; + border-radius: 20px; + padding: 48px 40px; + width: 100%; + max-width: 420px; + box-shadow: var(--shadow); + border: 1.5px solid var(--border); +} +.admin-logo { margin-bottom: 24px; } +.admin-login-card h1 { font-size: 1.5rem; font-weight: 700; margin-bottom: 24px; } + +/* Admin Layout */ +.admin-layout { + display: flex; + min-height: 100vh; +} + +/* Sidebar */ +.admin-sidebar { + width: 240px; + min-width: 240px; + background: var(--text); + color: white; + display: flex; + flex-direction: column; + padding: 24px 0; + position: sticky; + top: 0; + height: 100vh; + overflow-y: auto; +} +.admin-sidebar .logo { padding: 0 24px 32px; color: white; } +.admin-sidebar .logo span { color: #7c7cff; } +.admin-nav { + display: flex; + flex-direction: column; + gap: 4px; + flex: 1; +} +.nav-link { + display: block; + padding: 12px 24px; + color: rgba(255,255,255,0.7); + text-decoration: none; + font-size: 0.9rem; + font-weight: 500; + transition: all 0.2s; +} +.nav-link:hover, .nav-link.active { + background: rgba(255,255,255,0.1); + color: white; +} +.sidebar-footer { + padding: 16px 24px; + border-top: 1px solid rgba(255,255,255,0.15); + font-size: 0.85rem; + color: rgba(255,255,255,0.6); +} +.logout-link { + display: block; + color: #ff6b6b; + text-decoration: none; + margin-top: 8px; + font-weight: 600; +} + +/* Admin Main */ +.admin-main { + flex: 1; + padding: 32px; + overflow-y: auto; +} +.admin-header h1 { + font-size: 2rem; + font-weight: 800; + margin-bottom: 24px; +} + +/* Stats */ +.stats-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 16px; + margin-bottom: 32px; +} +.stat-card { + background: white; + border: 1.5px solid var(--border); + border-radius: 14px; + padding: 20px; + text-align: center; +} +.stat-number { font-size: 2rem; font-weight: 800; color: var(--primary); } +.stat-label { font-size: 0.8rem; color: var(--text-muted); margin-top: 4px; } + +/* Admin Section */ +.admin-section { margin-bottom: 40px; } +.section-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; +} +.section-header h2 { font-size: 1.4rem; font-weight: 700; } + +/* Tariff Admin Cards */ +.tariff-admin-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 16px; +} +.tariff-admin-card { + background: white; + border: 1.5px solid var(--border); + border-radius: 14px; + padding: 20px; +} +.tariff-admin-card.inactive { opacity: 0.65; } +.tariff-admin-header { margin-bottom: 10px; } +.tariff-status-badge { + font-size: 0.78rem; + font-weight: 600; + padding: 3px 10px; + border-radius: 20px; +} +.tariff-status-badge.active { background: #dcfce7; color: var(--success); } +.tariff-status-badge.inactive { background: #fee2e2; color: var(--error); } +.tariff-admin-card h3 { font-size: 1.05rem; font-weight: 700; margin-bottom: 12px; } +.tariff-admin-details { + display: flex; + flex-direction: column; + gap: 4px; + font-size: 0.85rem; + color: var(--text-muted); + margin-bottom: 16px; +} +.tariff-admin-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +/* Table */ +.table-wrap { overflow-x: auto; background: white; border-radius: 14px; border: 1.5px solid var(--border); } +.admin-table { + width: 100%; + border-collapse: collapse; + font-size: 0.88rem; +} +.admin-table th { + padding: 12px 16px; + text-align: left; + background: var(--bg); + font-weight: 700; + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text-muted); + border-bottom: 1.5px solid var(--border); +} +.admin-table td { + padding: 12px 16px; + border-bottom: 1px solid var(--border); + vertical-align: middle; +} +.admin-table tr:last-child td { border-bottom: none; } +.admin-table tr:hover td { background: var(--bg); } +.iban-cell { font-family: monospace; font-size: 0.8rem; } +.no-data { text-align: center; color: var(--text-muted); padding: 32px !important; } + +/* Search */ +.search-input { + padding: 8px 14px; + border: 1.5px solid var(--border); + border-radius: 8px; + font-family: 'Outfit', sans-serif; + font-size: 0.9rem; + outline: none; + width: 260px; +} +.search-input:focus { border-color: var(--primary); } + +/* Settings */ +.settings-card { + background: white; + border: 1.5px solid var(--border); + border-radius: 14px; + padding: 28px; + max-width: 480px; +} + +/* Form Controls (Admin) */ +.form-control { + width: 100%; + padding: 10px 14px; + border: 1.5px solid var(--border); + border-radius: 8px; + font-family: 'Outfit', sans-serif; + font-size: 0.92rem; + outline: none; + transition: border-color 0.2s; +} +.form-control:focus { border-color: var(--primary); } +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; +} + +/* Modal */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(0,0,0,0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + padding: 16px; +} +.modal { + background: white; + border-radius: 16px; + width: 100%; + max-width: 520px; + max-height: 90vh; + overflow-y: auto; +} +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 20px 24px; + border-bottom: 1.5px solid var(--border); +} +.modal-header h3 { font-size: 1.1rem; font-weight: 700; } +.modal-close { + background: none; + border: none; + font-size: 1.1rem; + cursor: pointer; + color: var(--text-muted); + padding: 4px 8px; + border-radius: 6px; +} +.modal-close:hover { background: var(--bg); } +.modal form { padding: 24px; } +.modal .form-group { margin-bottom: 16px; } +.modal .form-group label { display: block; font-size: 0.88rem; font-weight: 600; margin-bottom: 6px; } +.modal-footer { + display: flex; + justify-content: flex-end; + gap: 12px; + padding-top: 16px; + border-top: 1.5px solid var(--border); + margin-top: 8px; +} + +/* Responsive */ +@media (max-width: 768px) { + .admin-layout { flex-direction: column; } + .admin-sidebar { width: 100%; height: auto; position: relative; } + .admin-nav { flex-direction: row; overflow-x: auto; } + .page-title { font-size: 1.8rem; } + .form-row { grid-template-columns: 1fr; } +} + +/* ---- KATEGORIEN ---- */ +.category-list { + display: flex; + flex-direction: column; + gap: 10px; + margin-bottom: 20px; +} +.category-row { + display: flex; + align-items: center; + justify-content: space-between; + background: white; + border: 1.5px solid var(--border); + border-radius: 12px; + padding: 14px 20px; + gap: 16px; +} +.category-info { + display: flex; + align-items: center; + gap: 16px; +} +.category-name { + font-weight: 700; + font-size: 1rem; +} +.category-meta { + font-size: 0.8rem; + color: var(--text-muted); + background: var(--bg); + padding: 3px 10px; + border-radius: 20px; +} +.category-actions { + display: flex; + gap: 8px; + flex-shrink: 0; +} +.category-pill { + font-size: 0.75rem; + font-weight: 600; + background: #ede9fe; + color: #5b21b6; + padding: 3px 10px; + border-radius: 20px; +} +.no-data-card { + padding: 40px; + text-align: center; + color: var(--text-muted); + background: white; + border: 1.5px dashed var(--border); + border-radius: 14px; +} +.info-box { + background: #eff6ff; + border: 1.5px solid #bfdbfe; + border-radius: 10px; + padding: 14px 18px; + font-size: 0.88rem; + color: #1e40af; +} diff --git a/public/pdfs/Einverstaendniserklaerung.pdf b/public/pdfs/Einverstaendniserklaerung.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0bf5c2e757dfc3ac211de6506947ee083d65444c GIT binary patch literal 92896 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

P6^9+#fq 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 { + if (req.session.adminId) return res.redirect('/admin'); + res.render('admin/login', { error: null }); +}); + +router.post('/login', async (req, res) => { + const { username, password } = req.body; + try { + const [admins] = await db.query('SELECT * FROM admins WHERE username = ?', [username]); + if (admins.length === 0) return res.render('admin/login', { error: 'Ungültige Anmeldedaten.' }); + const valid = await bcrypt.compare(password, admins[0].password_hash); + if (!valid) return res.render('admin/login', { error: 'Ungültige Anmeldedaten.' }); + req.session.adminId = admins[0].id; + req.session.adminUser = admins[0].username; + res.redirect('/admin'); + } catch (err) { + res.render('admin/login', { error: 'Serverfehler.' }); + } +}); + +router.get('/logout', (req, res) => { + req.session.destroy(); + res.redirect('/admin/login'); +}); + +// Dashboard +router.get('/', requireAdmin, async (req, res) => { + try { + const [tariffs] = await db.query(` + SELECT t.*, c.name as category_name + FROM tariffs t LEFT JOIN categories c ON t.category_id = c.id + ORDER BY t.active DESC, t.created_at DESC + `); + const [categories] = await db.query('SELECT * FROM categories ORDER BY name ASC'); + const [memberships] = await db.query(` + SELECT m.*, t.name as tariff_name, t.price_monthly + FROM memberships m LEFT JOIN tariffs t ON m.tariff_id = t.id + ORDER BY m.created_at DESC + `); + const [stats] = await db.query(` + SELECT + COUNT(*) as total, + SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active_count, + SUM(CASE WHEN is_minor = 1 THEN 1 ELSE 0 END) as minors, + SUM(CASE WHEN created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY) THEN 1 ELSE 0 END) as last_30_days + FROM memberships + `); + res.render('admin/dashboard', { + tariffs, categories, memberships, stats: stats[0], + admin: req.session.adminUser, + success: req.query.success || null, + error: req.query.error || null + }); + } catch (err) { + console.error(err); + res.render('admin/dashboard', { + tariffs: [], categories: [], memberships: [], stats: {}, + admin: req.session.adminUser, + success: null, error: 'Datenbankfehler: ' + err.message + }); + } +}); + +// ===== KATEGORIEN ===== +router.post('/categories', requireAdmin, async (req, res) => { + const { name } = req.body; + if (!name || !name.trim()) return res.redirect('/admin?error=Kategoriename+fehlt'); + try { + await db.query('INSERT INTO categories (name) VALUES (?)', [name.trim()]); + res.redirect('/admin?success=Kategorie+erstellt#kategorien'); + } catch (err) { + res.redirect('/admin?error=Fehler+beim+Erstellen'); + } +}); + +router.post('/categories/:id/update', requireAdmin, async (req, res) => { + const { name } = req.body; + if (!name || !name.trim()) return res.redirect('/admin?error=Kategoriename+fehlt'); + try { + await db.query('UPDATE categories SET name = ? WHERE id = ?', [name.trim(), req.params.id]); + res.redirect('/admin?success=Kategorie+aktualisiert#kategorien'); + } catch (err) { + res.redirect('/admin?error=Fehler+beim+Aktualisieren'); + } +}); + +router.post('/categories/:id/delete', requireAdmin, async (req, res) => { + try { + const [used] = await db.query('SELECT COUNT(*) as c FROM tariffs WHERE category_id = ?', [req.params.id]); + if (used[0].c > 0) { + return res.redirect('/admin?error=Kategorie+wird+von+' + used[0].c + '+Tarifen+verwendet+–+bitte+erst+Tarife+umziehen#kategorien'); + } + await db.query('DELETE FROM categories WHERE id = ?', [req.params.id]); + res.redirect('/admin?success=Kategorie+gelöscht#kategorien'); + } catch (err) { + res.redirect('/admin?error=Fehler+beim+Löschen'); + } +}); + +// ===== TARIFE ===== +router.post('/tariffs', requireAdmin, async (req, res) => { + const { name, category_id, duration_months, price_monthly, start_package_price, description } = req.body; + try { + await db.query( + 'INSERT INTO tariffs (name, category_id, duration_months, price_monthly, start_package_price, description) VALUES (?, ?, ?, ?, ?, ?)', + [name, category_id || null, duration_months, price_monthly, start_package_price || 35.00, description || ''] + ); + res.redirect('/admin?success=Tarif+erstellt'); + } catch (err) { + res.redirect('/admin?error=Fehler+beim+Erstellen+des+Tarifs'); + } +}); + +router.post('/tariffs/:id/toggle', requireAdmin, async (req, res) => { + try { + await db.query('UPDATE tariffs SET active = NOT active WHERE id = ?', [req.params.id]); + res.redirect('/admin?success=Tarif+aktualisiert'); + } catch (err) { + res.redirect('/admin?error=Fehler+beim+Aktualisieren'); + } +}); + +router.post('/tariffs/:id/update', requireAdmin, async (req, res) => { + const { name, category_id, duration_months, price_monthly, start_package_price, description } = req.body; + try { + await db.query( + 'UPDATE tariffs SET name=?, category_id=?, duration_months=?, price_monthly=?, start_package_price=?, description=? WHERE id=?', + [name, category_id || null, duration_months, price_monthly, start_package_price, description, req.params.id] + ); + res.redirect('/admin?success=Tarif+aktualisiert'); + } catch (err) { + res.redirect('/admin?error=Fehler+beim+Aktualisieren'); + } +}); + +router.post('/tariffs/:id/delete', requireAdmin, async (req, res) => { + try { + const [members] = await db.query('SELECT COUNT(*) as c FROM memberships WHERE tariff_id = ?', [req.params.id]); + if (members[0].c > 0) return res.redirect('/admin?error=Tarif+hat+Mitglieder+–+bitte+deaktivieren'); + await db.query('DELETE FROM tariffs WHERE id = ?', [req.params.id]); + res.redirect('/admin?success=Tarif+gelöscht'); + } catch (err) { + res.redirect('/admin?error=Fehler+beim+Löschen'); + } +}); + +// Passwort ändern +router.post('/change-password', requireAdmin, async (req, res) => { + const { current_password, new_password, confirm_password } = req.body; + if (new_password !== confirm_password) return res.redirect('/admin?error=Passwörter+stimmen+nicht+überein'); + try { + const [admins] = await db.query('SELECT * FROM admins WHERE id = ?', [req.session.adminId]); + const valid = await bcrypt.compare(current_password, admins[0].password_hash); + if (!valid) return res.redirect('/admin?error=Aktuelles+Passwort+falsch'); + const hash = await bcrypt.hash(new_password, 12); + await db.query('UPDATE admins SET password_hash = ? WHERE id = ?', [hash, req.session.adminId]); + res.redirect('/admin?success=Passwort+geändert'); + } catch (err) { + res.redirect('/admin?error=Fehler+beim+Ändern+des+Passworts'); + } +}); + +module.exports = router; diff --git a/routes/api.js b/routes/api.js new file mode 100644 index 0000000..753db82 --- /dev/null +++ b/routes/api.js @@ -0,0 +1,105 @@ +const express = require('express'); +const router = express.Router(); +const dns = require('dns').promises; +const db = require('../config/database'); + +// Email Validierung via DNS MX-Record Check +async function verifyEmailDomain(email) { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(email)) return { valid: false, reason: 'Ungültiges E-Mail-Format' }; + + const domain = email.split('@')[1]; + try { + const records = await dns.resolveMx(domain); + if (records && records.length > 0) { + return { valid: true }; + } + return { valid: false, reason: 'Domain hat keine E-Mail-Server (MX-Records fehlen)' }; + } catch (err) { + return { valid: false, reason: 'E-Mail-Domain konnte nicht verifiziert werden' }; + } +} + +// POST /api/verify-email +router.post('/verify-email', async (req, res) => { + const { email } = req.body; + if (!email) return res.json({ valid: false, reason: 'Keine E-Mail angegeben' }); + + const result = await verifyEmailDomain(email); + res.json(result); +}); + +// POST /api/submit-membership +router.post('/submit-membership', async (req, res) => { + try { + const { + tariff_id, salutation, title, first_name, last_name, birth_date, + email, phone, street, address_addition, zip, city, + bank_name, account_holder, iban, + sepa_accepted, agb_accepted, datenschutz_accepted, data_correct, + guardian_consent + } = req.body; + + // E-Mail validieren + const emailCheck = await verifyEmailDomain(email); + if (!emailCheck.valid) { + return res.json({ success: false, error: 'E-Mail-Adresse ist nicht erreichbar: ' + emailCheck.reason }); + } + + // Pflichtfelder prüfen + if (!tariff_id || !first_name || !last_name || !birth_date || !email || !street || !zip || !city) { + return res.json({ success: false, error: 'Bitte alle Pflichtfelder ausfüllen.' }); + } + + if (!agb_accepted || !datenschutz_accepted || !data_correct) { + return res.json({ success: false, error: 'Bitte alle Einverständniserklärungen bestätigen.' }); + } + + // Alter berechnen + const birthDateObj = new Date(birth_date); + const today = new Date(); + let age = today.getFullYear() - birthDateObj.getFullYear(); + const m = today.getMonth() - birthDateObj.getMonth(); + if (m < 0 || (m === 0 && today.getDate() < birthDateObj.getDate())) age--; + + const is_minor = age < 18 ? 1 : 0; + + if (is_minor && !guardian_consent) { + return res.json({ success: false, error: 'Bei Minderjährigen ist die Einverständniserklärung der Erziehungsberechtigten erforderlich.' }); + } + + if (age < 14) { + return res.json({ success: false, error: 'Das Mindestalter für eine Mitgliedschaft beträgt 14 Jahre.' }); + } + + // Tarif prüfen + const [tariffs] = await db.query('SELECT * FROM tariffs WHERE id = ? AND active = 1', [tariff_id]); + if (tariffs.length === 0) { + return res.json({ success: false, error: 'Ungültiger oder inaktiver Tarif.' }); + } + + // In DB speichern + await db.query(` + INSERT INTO memberships + (tariff_id, salutation, title, first_name, last_name, birth_date, email, phone, + street, address_addition, zip, city, bank_name, account_holder, iban, + sepa_accepted, agb_accepted, datenschutz_accepted, data_correct, guardian_consent, is_minor) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `, [ + tariff_id, salutation, title || '', first_name, last_name, birth_date, + email, phone || '', street, address_addition || '', zip, city, + bank_name || '', account_holder || '', iban || '', + sepa_accepted ? 1 : 0, agb_accepted ? 1 : 0, + datenschutz_accepted ? 1 : 0, data_correct ? 1 : 0, + guardian_consent ? 1 : 0, is_minor + ]); + + res.json({ success: true }); + + } catch (err) { + console.error('Submit error:', err); + res.json({ success: false, error: 'Serverfehler. Bitte versuche es später erneut.' }); + } +}); + +module.exports = router; diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..42d576e --- /dev/null +++ b/routes/index.js @@ -0,0 +1,40 @@ +const express = require('express'); +const router = express.Router(); +const db = require('../config/database'); + +// Startseite - Tarife anzeigen +router.get('/', async (req, res) => { + try { + const [tariffs] = await db.query( + 'SELECT * FROM tariffs WHERE active = 1 ORDER BY price_monthly ASC' + ); + res.render('index', { tariffs, error: null }); + } catch (err) { + console.error(err); + res.render('index', { tariffs: [], error: 'Tarife konnten nicht geladen werden.' }); + } +}); + +// Anmelde-Formular für gewählten Tarif +router.get('/anmelden/:tariffId', async (req, res) => { + try { + const [tariffs] = await db.query( + 'SELECT * FROM tariffs WHERE id = ? AND active = 1', + [req.params.tariffId] + ); + if (tariffs.length === 0) { + return res.redirect('/'); + } + res.render('signup', { tariff: tariffs[0] }); + } catch (err) { + console.error(err); + res.redirect('/'); + } +}); + +// Erfolgsseite +router.get('/erfolg', (req, res) => { + res.render('success'); +}); + +module.exports = router; diff --git a/views/admin/dashboard.ejs b/views/admin/dashboard.ejs new file mode 100644 index 0000000..9d6b6e8 --- /dev/null +++ b/views/admin/dashboard.ejs @@ -0,0 +1,385 @@ + + + + + + PlusFit24 – Admin Dashboard + + + + +

+ + + +
+
+

Tarife

+
+
+
<%= stats.total || 0 %>
+
Gesamt Mitglieder
+
+
+
<%= stats.active_count || 0 %>
+
Aktive Mitglieder
+
+
+
<%= stats.last_30_days || 0 %>
+
Letzte 30 Tage
+
+
+
<%= stats.minors || 0 %>
+
Minderjährige
+
+
+
+ + <% if (success) { %>
<%= success %>
<% } %> + <% if (error) { %>
<%= error %>
<% } %> + + +
+
+

Tarife verwalten

+ +
+
+ <% tariffs.forEach(tariff => { %> +
+
+ + <%= tariff.active ? '✅ Aktiv' : '❌ Inaktiv' %> + + <% if (tariff.category_name) { %> + <%= tariff.category_name %> + <% } %> +
+

<%= tariff.name %>

+
+ 💰 <%= Number(tariff.price_monthly).toFixed(2) %>€/Monat + 📅 <%= tariff.duration_months %> Monate + 📦 Startpaket: <%= Number(tariff.start_package_price).toFixed(2) %>€ +
+
+ +
+ +
+
+ +
+
+
+ <% }) %> + <% if (tariffs.length === 0) { %> +
Noch keine Tarife angelegt.
+ <% } %> +
+
+ + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + diff --git a/views/admin/login.ejs b/views/admin/login.ejs new file mode 100644 index 0000000..bc39306 --- /dev/null +++ b/views/admin/login.ejs @@ -0,0 +1,40 @@ + + + + + + PlusFit24 – Admin Login + + + + + + + diff --git a/views/error.ejs b/views/error.ejs new file mode 100644 index 0000000..ab00d28 --- /dev/null +++ b/views/error.ejs @@ -0,0 +1,20 @@ + + + + + PlusFit24 – Fehler + + + + + +
+
+
⚠️
+

Fehler

+

<%= message %>

+ Zurück zur Startseite +
+
+ + diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 0000000..99f6539 --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,76 @@ + + + + + + PlusFit24 – Tarif Wählen + + + + + + + +
+ + + +
+

Tarif Wählen

+ + <% if (error) { %> +
<%= error %>
+ <% } %> + +
+ <% tariffs.forEach(tariff => { %> +
+
+
+ + <%= tariff.name %> +
+

<%= tariff.name %>

+
+ 📦 + Startpaket <%= Number(tariff.start_package_price).toFixed(2).replace('.', ',') %>€/einmalig +
+
+ <%= Number(tariff.price_monthly).toFixed(2).replace('.', ',') %>€ + /Monat +
+ + Tarif auswählen + +
+
+ <% }) %> + + <% if (tariffs.length === 0) { %> +
+

Aktuell sind keine Tarife verfügbar. Bitte versuche es später erneut.

+
+ <% } %> +
+
+
+ + + + diff --git a/views/signup.ejs b/views/signup.ejs new file mode 100644 index 0000000..5023594 --- /dev/null +++ b/views/signup.ejs @@ -0,0 +1,473 @@ + + + + + + PlusFit24 – Mitgliedschaft abschließen + + + + + + + +
+ + + + +
+ + + + + + diff --git a/views/success.ejs b/views/success.ejs new file mode 100644 index 0000000..fcf8a8e --- /dev/null +++ b/views/success.ejs @@ -0,0 +1,30 @@ + + + + + + PlusFit24 – Anmeldung erfolgreich + + + + + + +
+
+
+

Herzlich Willkommen!

+

Deine Mitgliedschaft wurde erfolgreich abgeschlossen. Wir freuen uns auf dich!

+

Du erhältst in Kürze eine Bestätigung.

+ Zurück zur Startseite +
+
+ + +