From 600ef6ac8da6b4c3d1d12b70a821b40795c31614 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 17 Jun 2026 21:56:38 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20View-Counter=20+=20Like-Button=20f?= =?UTF-8?q?=C3=BCr=20Beitr=C3=A4ge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DB: views + likes INTEGER Spalten (DEFAULT 0) - Backend: View-Inkrement auf /beitrag/, Like-API /api/like/ - Frontend: ๐Ÿ‘ Aufrufe + ๐Ÿ‘ Like-Button auf รœbersichtskarten - Detailseite: Views/Likes Anzeige - Like-Dedup: Cookie-basiert (1 Like pro Beitrag pro Browser, 365 Tage) --- app.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/app.py b/app.py index ffb735c..7a03c15 100644 --- a/app.py +++ b/app.py @@ -1803,6 +1803,10 @@ def public_frontend():

""" + preview + """

+
+ ๐Ÿ‘ """ + str(r['views'] or 0) + """ + +
""" @@ -1818,6 +1822,10 @@ def public_frontend():

""" + preview + """

+
+ ๐Ÿ‘ """ + str(r['views'] or 0) + """ + +
""" @@ -1873,6 +1881,14 @@ def public_frontend(): .text-only .card-content { position:relative; padding:0.55rem 0.85rem 0.65rem; } .text-only .story-time-overlay { position:absolute; top:auto; bottom:0.45rem; right:0.6rem; left:auto; z-index:5; } + /* Card stats (views + likes) */ + .card-stats { display:flex; align-items:center; gap:0.6rem; padding-top:0.35rem; margin-top:0.3rem; border-top:1px solid #f0ede6; } + .stat-views { font-size:0.68rem; color:#999; display:flex; align-items:center; gap:0.2rem; } + .stat-like-btn { background:none; border:1.5px solid #e0dcd3; border-radius:999px; padding:0.2rem 0.55rem; font-size:0.7rem; cursor:pointer; color:#888; font-family:inherit; transition:all 0.15s; display:flex; align-items:center; gap:0.15rem; -webkit-tap-highlight-color:transparent; } + .stat-like-btn:hover { border-color:#20228a; color:#20228a; background:rgba(32,34,138,0.05); } + .stat-like-btn.liked { background:#20228a; color:#fff; border-color:#20228a; font-weight:600; } + .stat-like-btn:active { transform:scale(0.94); } + /* Frontend filter bar */ .frontend-filter { max-width:1100px; margin:1rem auto 0; padding:0 1.5rem; display:flex; gap:0.4rem; flex-wrap:wrap; align-items:center; } .frontend-filter .filter-label { font-size:0.72rem; color:#888; font-weight:600; text-transform:uppercase; letter-spacing:0.05em; } @@ -2231,6 +2247,31 @@ def public_frontend(): })(); +