# Blut24 — Marketing- und Registrierungsseite Öffentliche Website für **Blut24**, die Plattform für Blutkonserven und Blutprodukte. Sie erklärt das Produkt und nimmt die Registrierung von **Kliniken** und **medizinischen Kurierdiensten** entgegen — inklusive Klinik-Autovervollständigung, E-Mail-Domain-Prüfung, Double-Opt-in und einer abschaltbaren Übergabe an das Blut24/LogShip-ERP. Eigenständiges Repository. Es hat **keine Laufzeit-Abhängigkeit** zum ERP-Repo (`../erp-nuxt-frontend`); der ERP wird — falls aktiviert — ausschließlich über HTTP angesprochen. --- ## Stack | Bereich | Technologie | |---|---| | Framework | Nuxt 4 (SSR) + Nitro | | Styling | Tailwind CSS v4 (Vite-Plugin, kein Nuxt-Modul) + Design-Tokens in `app/assets/css/main.css` | | Datenbank | SQLite via `better-sqlite3` (Klinikverzeichnis mit FTS5, Registrierungen) | | E-Mail | `nodemailer` gegen einen lokalen MTA (localhost:25, ohne Auth) | | Icons/Bilder | ausschließlich handgezeichnetes Inline-SVG und CSS-Verläufe, keine externen Assets | | Schriften | System-Schriftstack (bewusst **kein** Google-Fonts-CDN → DSGVO, keine Fremdanfragen) | | Sprachen | Deutsch (Vorgabe) und Englisch — eigenes Katalog-Composable, **kein** `@nuxtjs/i18n` (siehe *Sprachen*) | --- ## Schnellstart ```bash npm install --legacy-peer-deps # siehe Hinweis unten npm run import:clinics # data/clinics.db aus dem Klinik-Atlas-XML bauen npm run dev # http://localhost:3000 ``` Produktion: ```bash npm run import:clinics npm run build node .output/server/index.mjs # PORT=3000 HOST=0.0.0.0 ``` > **`--legacy-peer-deps`:** npm 10.9.8 bricht bei diesem Abhängigkeitsbaum mit > `Cannot read properties of null (reading 'edgesOut')` ab (npm-Bug in der > Peer-Auflösung). Mit `--legacy-peer-deps` installiert es sauber durch; die > Anwendung selbst ist davon nicht betroffen. --- ## Datenpflege: Klinikverzeichnis Grundlage ist der offene Datensatz des **Bundes-Klinik-Atlas** (Transparenzverzeichnis, `data/2026-06-30_TVERZ_Export.xml`, 1.581 Standorte). ```bash npm run import:clinics # optional mit anderer Quelle / anderem Ziel: node scripts/import-clinics.mjs --source data/2026-12-31_TVERZ_Export.xml --out data/clinics.db ``` Der Import liest `Standort > StandortKontaktDaten` (`STOID`, `Land`, `Name`, `Strasse`, `PLZ`, `Ort`, `URL`, `Telefon`, `EMail`, `TraegerArt`, `Breitengrad`, `Laengengrad`) und `StandortStrukturDaten/@AnzahlBetten`, leitet je Standort die **registrierbare E-Mail-Domain** ab (aus `EMail`, ersatzweise `URL`; `www.` entfernt, Subdomains auf die eTLD+1 reduziert, Freemail-Adressen verworfen) und schreibt `data/clinics.db` neu. Ergebnis des aktuellen Datenstands: ``` Standorte importiert : 1581 mit E-Mail-Domain : 1556 (98,4 %) ohne Domain : 25 (1,6 %) → manuelle Freigabe eindeutige Domains : 1206 Domains mit mehreren Standorten (Klinikkonzerne): 280 helios-gesundheit.de 78 Standorte asklepios.com 45 Standorte sana.de 41 Standorte helios-kliniken.de 24 Standorte ameos.de 21 Standorte ``` Schema von `data/clinics.db`: | Tabelle | Inhalt | |---|---| | `clinics` | ein Datensatz je Standort (`stoid` eindeutig), inkl. `domain` (primär) und `domains` (alle) | | `clinic_domains` | `(domain, stoid, source)` — Domain → Standorte, der Schlüssel für die Verbund-Auflösung | | `clinics_fts` | FTS5 (contentless, `unicode61 remove_diacritics 2`) über Name, Ort, Straße, PLZ, STOID inkl. Umlautvarianten (`München`/`Muenchen`/`Munchen`) | | `meta` | Quelldatei, Importzeitpunkt, Zählwerte | `data/clinics.db` ist ein **Build-Artefakt** und in `.gitignore` — nach jedem Deployment neu erzeugen. --- ## Sprachen Die Seite ist vollständig zweisprachig: **Deutsch ist die Vorgabe**, Englisch wird über den Schalter `DE | EN` in der Kopfzeile erreicht (zwei echte `