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:
parent
65d1cf6c7f
commit
180de32e57
22 changed files with 4351 additions and 189 deletions
|
|
@ -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.")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue