feat: Grundgerüst -- base_template, Home, Impressum, Datenschutz
This commit is contained in:
@@ -1,123 +1,98 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""IT-Hilfe-Sofort.de — Flask-Webapp für IT-Dienstleistungen im Gesundheitswesen.
|
"""IT-Hilfe-Sofort.de — Flask-Webapp für IT-Dienstleistungen im Gesundheitswesen."""
|
||||||
|
|
||||||
BSN Coding Standards: Typ-Annotationen (PEP 604), deutsche Docstrings, Ruff+Mypy.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
|
|
||||||
# ── Config ──────────────────────────────────────────────────────────
|
|
||||||
BASE_DIR = Path(__file__).parent
|
BASE_DIR = Path(__file__).parent
|
||||||
PORT = int(os.environ.get("PORT", "5003"))
|
PORT = int(os.environ.get("PORT", "5003"))
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
||||||
# ── Hilfsfunktionen ──────────────────────────────────────────────────
|
|
||||||
def _base_template(title: str, content: str, active: str = "") -> str:
|
def _base_template(title: str, content: str, active: str = "") -> str:
|
||||||
"""Wrapper für einheitliches Seitenlayout.
|
"""Wrapper fuer einheitliches Seitenlayout.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
title: Seitentitel (wird in <title> + <h1> verwendet).
|
title: Seitentitel als String.
|
||||||
content: HTML-Inhalt der Seite.
|
content: HTML-Inhalt der Seite.
|
||||||
active: Aktiver Navigationspunkt (z. B. 'blog', 'leistungen').
|
active: Aktiver Navigationspunkt.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Vollständiges HTML-Dokument als String.
|
Vollstaendiges HTML-Dokument als String.
|
||||||
"""
|
"""
|
||||||
return f"""<!DOCTYPE html>
|
return f"""<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>{title} | IT-Hilfe-Sofort.de</title>
|
<title>{title} | IT-Hilfe-Sofort.de</title>
|
||||||
<style>
|
<style>
|
||||||
*,*::before,*::after{{box-sizing:border-box;margin:0;padding:0}}
|
*,*::before,*::after{{box-sizing:border-box;margin:0;padding:0}}
|
||||||
body{{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#F9FAFB;color:#1F2937;line-height:1.6}}
|
body{{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#F9FAFB;color:#1F2937;line-height:1.6}}
|
||||||
/* Header */
|
|
||||||
.site-header{{background:#1F2937;padding:1rem 1.5rem;display:flex;align-items:center;justify-content:space-between}}
|
.site-header{{background:#1F2937;padding:1rem 1.5rem;display:flex;align-items:center;justify-content:space-between}}
|
||||||
.site-header .logo{{color:#F9FAFB;font-weight:700;font-size:1.05rem;letter-spacing:-0.01em;text-decoration:none}}
|
.site-header .logo{{color:#F9FAFB;font-weight:700;font-size:1.05rem;letter-spacing:-0.01em;text-decoration:none}}
|
||||||
.nav-link{{color:#9CA3AF;text-decoration:none;font-size:0.9rem;padding:0.5rem}}
|
.nav-link{{color:#9CA3AF;text-decoration:none;font-size:0.9rem;padding:0.5rem}}
|
||||||
.nav-link:hover,.nav-link.active{{color:#F9FAFB}}
|
.nav-link:hover,.nav-link.active{{color:#F9FAFB}}
|
||||||
.menu-toggle{{background:none;border:none;color:#9CA3AF;font-size:0.9rem;font-weight:600;cursor:pointer;padding:0.5rem}}
|
.menu-toggle{{background:none;border:none;color:#9CA3AF;font-size:0.9rem;font-weight:600;cursor:pointer;padding:0.5rem;display:none}}
|
||||||
/* Hero */
|
|
||||||
.hero{{background:linear-gradient(135deg,#20228a,#161e6e);color:#fff;padding:5rem 1.5rem;text-align:center}}
|
.hero{{background:linear-gradient(135deg,#20228a,#161e6e);color:#fff;padding:5rem 1.5rem;text-align:center}}
|
||||||
.hero h1{{font-size:2.2rem;font-weight:800;letter-spacing:-0.02em;line-height:1.2;margin-bottom:1rem}}
|
.hero h1{{font-size:2.2rem;font-weight:800;letter-spacing:-0.02em;line-height:1.2;margin-bottom:1rem}}
|
||||||
.hero p{{color:rgba(255,255,255,0.85);font-size:1.1rem;max-width:600px;margin:0 auto}}
|
.hero p{{color:rgba(255,255,255,0.85);font-size:1.1rem;max-width:600px;margin:0 auto}}
|
||||||
/* Cards */
|
|
||||||
.card{{background:#fff;border:1px solid #E5E7EB;border-radius:8px;padding:2rem}}
|
.card{{background:#fff;border:1px solid #E5E7EB;border-radius:8px;padding:2rem}}
|
||||||
.card h2{{font-size:1.5rem;font-weight:700;letter-spacing:-0.01em;margin-bottom:0.5rem}}
|
|
||||||
.card p{{font-size:1rem;line-height:1.7;color:#374151}}
|
|
||||||
.card-grid{{display:grid;grid-template-columns:1fr;gap:1.5rem;max-width:1100px;margin:0 auto;padding:0 1.5rem}}
|
.card-grid{{display:grid;grid-template-columns:1fr;gap:1.5rem;max-width:1100px;margin:0 auto;padding:0 1.5rem}}
|
||||||
@media(min-width:768px){{.card-grid{{grid-template-columns:repeat(3,1fr)}}}}
|
@media(min-width:768px){{.card-grid{{grid-template-columns:repeat(3,1fr)}}}}
|
||||||
/* Buttons */
|
|
||||||
.btn-primary{{display:inline-block;background:#20228a;color:#fff;border:none;border-radius:6px;padding:0.8rem 2rem;font-size:0.95rem;font-weight:600;text-decoration:none;cursor:pointer;transition:background 0.2s}}
|
.btn-primary{{display:inline-block;background:#20228a;color:#fff;border:none;border-radius:6px;padding:0.8rem 2rem;font-size:0.95rem;font-weight:600;text-decoration:none;cursor:pointer;transition:background 0.2s}}
|
||||||
.btn-primary:hover{{background:#161e6e}}
|
.btn-primary:hover{{background:#161e6e}}
|
||||||
/* Content */
|
|
||||||
.content{{max-width:720px;margin:2rem auto;padding:0 1.5rem}}
|
.content{{max-width:720px;margin:2rem auto;padding:0 1.5rem}}
|
||||||
.content h1{{font-size:2rem;font-weight:800;margin-bottom:1rem}}
|
.content h1{{font-size:2rem;font-weight:800;margin-bottom:1rem}}
|
||||||
.content h2{{font-size:1.5rem;font-weight:700;margin:2rem 0 1rem}}
|
.content h2{{font-size:1.5rem;font-weight:700;margin:2rem 0 1rem}}
|
||||||
.content p{{margin-bottom:1rem;line-height:1.7}}
|
.content p{{margin-bottom:1rem;line-height:1.7}}
|
||||||
/* Footer */
|
|
||||||
.site-footer{{background:#1F2937;color:#9CA3AF;padding:3rem 1.5rem;font-size:0.85rem;text-align:center}}
|
.site-footer{{background:#1F2937;color:#9CA3AF;padding:3rem 1.5rem;font-size:0.85rem;text-align:center}}
|
||||||
.site-footer a{{color:#D1D5DB;text-decoration:none;margin:0 0.5rem}}
|
.site-footer a{{color:#D1D5DB;text-decoration:none;margin:0 0.5rem}}
|
||||||
.site-footer a:hover{{color:#F9FAFB}}
|
.site-footer a:hover{{color:#F9FAFB}}
|
||||||
/* Section */
|
|
||||||
.section{{padding:4rem 1.5rem}}
|
.section{{padding:4rem 1.5rem}}
|
||||||
.section h2{{font-size:1.8rem;font-weight:700;text-align:center;margin-bottom:2rem}}
|
.section h2{{font-size:1.8rem;font-weight:700;text-align:center;margin-bottom:2rem}}
|
||||||
|
@media(max-width:767px){{.menu-toggle{{display:block}}nav#mainNav{{display:none}}nav#mainNav.open{{display:flex;flex-direction:column;position:fixed;top:56px;left:0;right:0;background:#1F2937;padding:1rem;gap:0;z-index:1000}}}}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header class="site-header">
|
<header class="site-header">
|
||||||
<a href="/" class="logo">IT-Hilfe-Sofort.de</a>
|
<a href="/" class="logo">IT-Hilfe-Sofort.de</a>
|
||||||
<nav id="mainNav" style="display:flex;align-items:center;gap:0.5rem">
|
<nav id="mainNav" style="align-items:center;gap:0.5rem">
|
||||||
<a href="/blog/telematik-vorschriften" class="nav-link{' active' if active=='blog' else ''}">Blog</a>
|
<a href="/" class="nav-link{" active" if active == "home" else ""}">Startseite</a>
|
||||||
<a href="/leistungen/pflegedienste" class="nav-link{' active' if active=='leistungen' else ''}">Leistungen</a>
|
<a href="/blog/telematik-vorschriften" class="nav-link{" active" if active == "blog" else ""}">Blog</a>
|
||||||
<a href="/it-service/hardware" class="nav-link{' active' if active=='it-service' else ''}">IT-Service</a>
|
<a href="/leistungen/pflegedienste" class="nav-link{" active" if active == "leistungen" else ""}">Leistungen</a>
|
||||||
<a href="/ueber-uns" class="nav-link{' active' if active=='ueber-uns' else ''}">Über uns</a>
|
<a href="/it-service/hardware" class="nav-link{" active" if active == "it-service" else ""}">IT-Service</a>
|
||||||
|
<a href="/ueber-uns" class="nav-link{" active" if active == "ueber-uns" else ""}">Über uns</a>
|
||||||
<a href="/kontakt" class="btn-primary" style="padding:0.5rem 1.2rem;font-size:0.85rem">Kontakt</a>
|
<a href="/kontakt" class="btn-primary" style="padding:0.5rem 1.2rem;font-size:0.85rem">Kontakt</a>
|
||||||
</nav>
|
</nav>
|
||||||
<button class="menu-toggle" id="menuToggle" onclick="document.getElementById('mainNav').classList.toggle('open')">Menü</button>
|
<button class="menu-toggle" onclick="document.getElementById('mainNav').classList.toggle('open')">Menü</button>
|
||||||
</header>
|
</header>
|
||||||
<main>{content}</main>
|
<main>{content}</main>
|
||||||
<footer class="site-footer">
|
<footer class="site-footer">
|
||||||
<p>IT-Hilfe-Sofort.de — Spezialisiert auf Pflegeeinrichtungen</p>
|
<p>IT-Hilfe-Sofort.de — Spezialisiert auf Pflegeeinrichtungen</p>
|
||||||
<p style="margin-top:0.5rem">
|
<p style="margin-top:0.5rem"><a href="/impressum">Impressum</a> <a href="/datenschutz">Datenschutz</a></p>
|
||||||
<a href="/impressum">Impressum</a>
|
|
||||||
<a href="/datenschutz">Datenschutz</a>
|
|
||||||
</p>
|
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>"""
|
</html>"""
|
||||||
|
|
||||||
|
|
||||||
# ── Routen ───────────────────────────────────────────────────────────
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
def index() -> str:
|
def index() -> str:
|
||||||
"""Startseite."""
|
"""Startseite."""
|
||||||
content = """
|
content = """
|
||||||
<section class="hero">
|
<section class="hero">
|
||||||
<h1>IT-Hilfe für das Gesundheitswesen</h1>
|
<h1>IT-Hilfefür das Gesundheitswesen</h1>
|
||||||
<p>Sicher, schnell, spezialisiert auf Pflegeeinrichtungen.</p>
|
<p>Sicher, schnell, spezialisiert auf Pflegeinrichtungen.</p>
|
||||||
<p style="margin-top:2rem"><a href="/kontakt" class="btn-primary">Beratungsgespräch vereinbaren</a></p>
|
<p style="margin-top:2rem"><a href="/kontakt" class="btn-primary">Beratungsgespräch vereinbaren</a></p>
|
||||||
</section>
|
</section>
|
||||||
<section class="section">
|
<section class="section">
|
||||||
<h2>Unsere Werte</h2>
|
<h2>Unsere Werte</h2>
|
||||||
<div class="card-grid">
|
<div class="card-grid">
|
||||||
<div class="card">
|
<div class="card"><h2>DSGVO-konform</h2><p>Ihre Patientendaten in sicheren Händen — mit lückenloser Dokumentation und zertifizierten Prozessen.</p></div>
|
||||||
<h2>DSGVO-konform</h2>
|
<div class="card"><h2>24/7 Support</h2><p>Wir sind da, wenn Sie uns brauchen — mit garantierter Reaktionszeit und persönlichem Ansprechpartner.</p></div>
|
||||||
<p>Ihre Patientendaten in sicheren Händen — mit lückenloser Dokumentation und zertifizierten Prozessen.</p>
|
<div class="card"><h2>Förderfähig</h2><p>KfW-Anträge stellen wir gemeinsam — digitale Infrastruktur ohne finanzielle Hürden.</p></div>
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<h2>24/7 Support</h2>
|
|
||||||
<p>Wir sind da, wenn Sie uns brauchen — mit garantierter Reaktionszeit und persönlichem Ansprechpartner.</p>
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<h2>Förderfähig</h2>
|
|
||||||
<p>KfW-Anträge stellen wir gemeinsam — digitale Infrastruktur ohne finanzielle Hürden.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section class="section" style="background:#fff">
|
<section class="section" style="background:#fff">
|
||||||
@@ -126,7 +101,7 @@ def index() -> str:
|
|||||||
<div class="card"><h2>Pflegedienste</h2><p>Tourenplanung, mobile Datenerfassung, Abrechnung.</p></div>
|
<div class="card"><h2>Pflegedienste</h2><p>Tourenplanung, mobile Datenerfassung, Abrechnung.</p></div>
|
||||||
<div class="card"><h2>Pflegeheime</h2><p>Heimverwaltung, Biometrie, Dokumentation.</p></div>
|
<div class="card"><h2>Pflegeheime</h2><p>Heimverwaltung, Biometrie, Dokumentation.</p></div>
|
||||||
<div class="card"><h2>Tagespflegen</h2><p>Terminbuchung, Fahrdienst, Aktivierungsangebote.</p></div>
|
<div class="card"><h2>Tagespflegen</h2><p>Terminbuchung, Fahrdienst, Aktivierungsangebote.</p></div>
|
||||||
<div class="card"><h2>Hardware</h2><p>Server, Thin Clients, Drucker — Beschaffung & Einrichtung.</p></div>
|
<div class="card"><h2>Hardware</h2><p>Server, Thin Clients, Drucker — Beschaftung & Einrichtung.</p></div>
|
||||||
<div class="card"><h2>Netzwerk</h2><p>WLAN-Ausleuchtung, VPN, Firewall, Netzwerksegmentierung.</p></div>
|
<div class="card"><h2>Netzwerk</h2><p>WLAN-Ausleuchtung, VPN, Firewall, Netzwerksegmentierung.</p></div>
|
||||||
<div class="card"><h2>Support</h2><p>SLA-Stufen, Fernwartung, Monitoring — maßgeschneidert.</p></div>
|
<div class="card"><h2>Support</h2><p>SLA-Stufen, Fernwartung, Monitoring — maßgeschneidert.</p></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -138,25 +113,17 @@ def index() -> str:
|
|||||||
@app.route("/impressum")
|
@app.route("/impressum")
|
||||||
def impressum() -> str:
|
def impressum() -> str:
|
||||||
"""Impressum."""
|
"""Impressum."""
|
||||||
content = """<div class="content">
|
content = '<div class="content"><h1>Impressum</h1><p>Daniel Krause<br>Musterstraße 1<br>12345 Musterstadt</p><p>E-Mail: info@it-hilfe-sofort.de</p></div>'
|
||||||
<h1>Impressum</h1>
|
|
||||||
<p>Daniel Krause<br>Musterstraße 1<br>12345 Musterstadt</p>
|
|
||||||
<p>E-Mail: info@it-hilfe-sofort.de</p>
|
|
||||||
</div>"""
|
|
||||||
return _base_template("Impressum", content)
|
return _base_template("Impressum", content)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/datenschutz")
|
@app.route("/datenschutz")
|
||||||
def datenschutz() -> str:
|
def datenschutz() -> str:
|
||||||
"""Datenschutzerklärung."""
|
"""Datenschutzerklärung."""
|
||||||
content = """<div class="content">
|
content = '<div class="content"><h1>Datenschutzerklärung</h1><p>Platzhalter — vollständige Datenschutzerklärung folgt.</p></div>'
|
||||||
<h1>Datenschutzerklärung</h1>
|
|
||||||
<p>Platzhalter — vollständige Datenschutzerklärung folgt.</p>
|
|
||||||
</div>"""
|
|
||||||
return _base_template("Datenschutz", content)
|
return _base_template("Datenschutz", content)
|
||||||
|
|
||||||
|
|
||||||
# ── Main ─────────────────────────────────────────────────────────────
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print(f"🚀 IT-Hilfe-Sofort.de startet auf http://127.0.0.1:{PORT}")
|
print(f"IT-Hilfe-Sofort.de startet auf http://127.0.0.1:{PORT}")
|
||||||
app.run(host="127.0.0.1", port=PORT, debug=False)
|
app.run(host="127.0.0.1", port=PORT, debug=False)
|
||||||
|
|||||||
Reference in New Issue
Block a user