Session 2026-04-21: SEO, Wiki-Anreicherung, Training, Lober

SEO & Crawler:
- robots.txt, llms.txt, sitemap.xml (508 Seiten bei Google)
- SSR-Seiten: /info, /wiki/rassen, /wiki/rasse/{slug}, /knigge
- Open Graph, JSON-LD, Breadcrumbs in index.html

Navigation:
- Training unter "Mein Hund", Wissen collapsible
- Welcome-Seite und Landing-Page auf 5-Gruppen-Struktur

Wiki:
- KI-Anreicherung (Claude API): beschreibung, vorkommen_de, Steckbrief
- "So einen hab ich" / Züchter-Verzeichnis
- Scheduler: 50 Rassen beim Start, 20/Nacht

Training:
- Session-Logging (Erfolgsquote, Stimmung, Zufriedenheit)
- Virtueller KI-Trainer (6h-Cache)
- Trainingskalender (Habit-Tracker)
- Top-Training → automatischer Tagebucheintrag
- Gamification ohne Druck: Badges, Streak, Stats

Fortschritts-Lober:
- Jeden Montag 09:00: Claude schreibt Lob-Text pro Hund
- Push + Karte im Tagebuch

Monitoring:
- 4× täglich Status-Mail mit Scheduler-Status + Wiki-Fortschritt
This commit is contained in:
rene 2026-04-21 19:38:20 +02:00
parent 65d1cf6c7f
commit 180de32e57
22 changed files with 4351 additions and 189 deletions

View file

@ -910,3 +910,102 @@ def _migrate(conn_factory):
logger.info("Migration: real_name Spalte hinzugefügt, %d User migriert.", len(rows))
except Exception:
pass
# Wiki: Rassen-Anreicherung
for col, typedef in [
("beschreibung", "TEXT"),
("vorkommen_de", "TEXT"),
("wikipedia_url_de","TEXT"),
("ki_enriched", "INTEGER DEFAULT 0"),
]:
try:
conn.execute(f"ALTER TABLE wiki_rassen ADD COLUMN {col} {typedef}")
except Exception:
pass
logger.info("Migration: wiki_rassen Anreicherungs-Felder bereit.")
# Wiki: Züchter-Verzeichnis
conn.executescript("""
CREATE TABLE IF NOT EXISTS wiki_zuchter (
id INTEGER PRIMARY KEY AUTOINCREMENT,
rasse_slug TEXT NOT NULL,
name TEXT NOT NULL,
zwingername TEXT,
ort TEXT,
plz TEXT,
bundesland TEXT,
vdh_mitglied INTEGER DEFAULT 0,
website TEXT,
telefon TEXT,
beschreibung TEXT,
verified INTEGER DEFAULT 0,
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_wiki_zuchter_rasse ON wiki_zuchter(rasse_slug, verified);
""")
logger.info("Migration: wiki_zuchter Tabelle bereit.")
# Wiki: Rasse-Interesse ("So einen hab ich" / "Interessiert mich")
conn.executescript("""
CREATE TABLE IF NOT EXISTS wiki_breed_interest (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
rasse_slug TEXT NOT NULL,
typ TEXT NOT NULL DEFAULT 'hat',
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(user_id, rasse_slug)
);
CREATE INDEX IF NOT EXISTS idx_wbi_rasse ON wiki_breed_interest(rasse_slug, typ);
CREATE INDEX IF NOT EXISTS idx_wbi_user ON wiki_breed_interest(user_id);
""")
logger.info("Migration: wiki_breed_interest Tabelle bereit.")
# Training: Session-Protokoll
conn.executescript("""
CREATE TABLE IF NOT EXISTS training_sessions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
dog_id INTEGER NOT NULL REFERENCES dogs(id) ON DELETE CASCADE,
exercise_id TEXT NOT NULL,
exercise_name TEXT NOT NULL,
datum TEXT NOT NULL DEFAULT (date('now')),
wiederholungen INTEGER DEFAULT 1,
erfolgsquote INTEGER DEFAULT 50,
hund_stimmung TEXT DEFAULT 'aufmerksam',
zufriedenheit INTEGER DEFAULT 3,
notiz TEXT,
ist_top INTEGER DEFAULT 0,
diary_entry_id INTEGER REFERENCES diary(id) ON DELETE SET NULL,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_ts_user_dog ON training_sessions(user_id, dog_id, datum DESC);
CREATE INDEX IF NOT EXISTS idx_ts_exercise ON training_sessions(exercise_id, user_id);
""")
logger.info("Migration: training_sessions Tabelle bereit.")
# Training: KI-Feedback-Cache
conn.executescript("""
CREATE TABLE IF NOT EXISTS training_ki_cache (
dog_id INTEGER PRIMARY KEY,
feedback TEXT NOT NULL,
generated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
""")
logger.info("Migration: training_ki_cache Tabelle bereit.")
# Fortschritts-Lober: wöchentliche Lob-Karten
conn.executescript("""
CREATE TABLE IF NOT EXISTS weekly_praise (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
dog_id INTEGER NOT NULL REFERENCES dogs(id) ON DELETE CASCADE,
week_key TEXT NOT NULL, -- ISO-Woche, z.B. "2026-W17"
praise_text TEXT NOT NULL,
stats_json TEXT, -- JSON der gesammelten Stats (für Debugging)
generated_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(dog_id, week_key)
);
CREATE INDEX IF NOT EXISTS idx_wp_dog_week ON weekly_praise(dog_id, week_key DESC);
""")
logger.info("Migration: weekly_praise Tabelle bereit.")