Files
it-hilf-sofort/app.py
T
Hermes Agent 0fc4301b8b feat: Initial — Flask-Grundgerüst mit Startseite, Impressum, Datenschutz
- app.py: _base_template() mit BSN-Blau Design (seriös+agil, keine Icons)
- ALICIA.md: Vollständiger Bauplan (19 Routen, CRM-Formular, Coding-Standards)
- .gitignore: .env, *.db, __pycache__
2026-06-25 15:41:18 +02:00

163 lines
7.8 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""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
from pathlib import Path
from flask import Flask
# ── Config ──────────────────────────────────────────────────────────
BASE_DIR = Path(__file__).parent
PORT = int(os.environ.get("PORT", "5003"))
app = Flask(__name__)
# ── Hilfsfunktionen ──────────────────────────────────────────────────
def _base_template(title: str, content: str, active: str = "") -> str:
"""Wrapper für einheitliches Seitenlayout.
Args:
title: Seitentitel (wird in <title> + <h1> verwendet).
content: HTML-Inhalt der Seite.
active: Aktiver Navigationspunkt (z.B. 'blog', 'leistungen').
Returns:
Vollständiges HTML-Dokument als String.
"""
return f"""<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>{title} | IT-Hilfe-Sofort.de</title>
<style>
*,*::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}}
/* Header */
.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}}
.nav-link{{color:#9CA3AF;text-decoration:none;font-size:0.9rem;padding:0.5rem}}
.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}}
/* Hero */
.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 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 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}}
@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:hover{{background:#161e6e}}
/* Content */
.content{{max-width:720px;margin:2rem auto;padding:0 1.5rem}}
.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 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 a{{color:#D1D5DB;text-decoration:none;margin:0 0.5rem}}
.site-footer a:hover{{color:#F9FAFB}}
/* Section */
.section{{padding:4rem 1.5rem}}
.section h2{{font-size:1.8rem;font-weight:700;text-align:center;margin-bottom:2rem}}
</style>
</head>
<body>
<header class="site-header">
<a href="/" class="logo">IT-Hilfe-Sofort.de</a>
<nav id="mainNav" style="display:flex;align-items:center;gap:0.5rem">
<a href="/blog/telematik-vorschriften" class="nav-link{' active' if active=='blog' else ''}">Blog</a>
<a href="/leistungen/pflegedienste" class="nav-link{' active' if active=='leistungen' else ''}">Leistungen</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>
</nav>
<button class="menu-toggle" id="menuToggle" onclick="document.getElementById('mainNav').classList.toggle('open')">Menü</button>
</header>
<main>{content}</main>
<footer class="site-footer">
<p>IT-Hilfe-Sofort.de — Spezialisiert auf Pflegeeinrichtungen</p>
<p style="margin-top:0.5rem">
<a href="/impressum">Impressum</a>
<a href="/datenschutz">Datenschutz</a>
</p>
</footer>
</body>
</html>"""
# ── Routen ───────────────────────────────────────────────────────────
@app.route("/")
def index() -> str:
"""Startseite."""
content = """
<section class="hero">
<h1>IT-Hilfe für das Gesundheitswesen</h1>
<p>Sicher, schnell, spezialisiert auf Pflegeeinrichtungen.</p>
<p style="margin-top:2rem"><a href="/kontakt" class="btn-primary">Beratungsgespräch vereinbaren</a></p>
</section>
<section class="section">
<h2>Unsere Werte</h2>
<div class="card-grid">
<div class="card">
<h2>DSGVO-konform</h2>
<p>Ihre Patientendaten in sicheren Händen — mit lückenloser Dokumentation und zertifizierten Prozessen.</p>
</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>
</section>
<section class="section" style="background:#fff">
<h2>Unsere Leistungen</h2>
<div class="card-grid">
<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>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>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>
</section>
"""
return _base_template("Startseite", content)
@app.route("/impressum")
def impressum() -> str:
"""Impressum."""
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>"""
return _base_template("Impressum", content)
@app.route("/datenschutz")
def datenschutz() -> str:
"""Datenschutzerklärung."""
content = """<div class="content">
<h1>Datenschutzerklärung</h1>
<p>Platzhalter — vollständige Datenschutzerklärung folgt.</p>
</div>"""
return _base_template("Datenschutz", content)
# ── Main ─────────────────────────────────────────────────────────────
if __name__ == "__main__":
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)