diff --git a/app/routers/web.py b/app/routers/web.py index 389ff2f..6f9861e 100644 --- a/app/routers/web.py +++ b/app/routers/web.py @@ -169,7 +169,17 @@ def dashboard(request: Request, user: User = Depends(get_current_user_web), db: @router.get("/profiles", response_class=HTMLResponse) def profile_list(request: Request, user: User = Depends(get_current_user_web), db: Session = Depends(get_db)): profiles = db.query(Profile).filter(Profile.user_id == user.id).all() - return templates.TemplateResponse("profiles.html", {"request": request, "user": user, "profiles": profiles}) + extras = {} + for p in profiles: + cards = db.query(Postcard).filter(Postcard.profile_id == p.id).all() + extras[p.id] = { + "total": len(cards), + "sent": sum(1 for c in cards if c.status == "sent"), + "delivered": sum(1 for c in cards if c.status == "delivered"), + "received": sum(1 for c in cards if c.status == "received"), + "countries": len({c.country for c in cards if c.country}), + } + return templates.TemplateResponse("profiles.html", {"request": request, "user": user, "profiles": profiles, "extras": extras}) @router.post("/profiles") diff --git a/app/static/style.css b/app/static/style.css index 93fdff6..7db0970 100644 --- a/app/static/style.css +++ b/app/static/style.css @@ -142,6 +142,30 @@ code { background: var(--bg); padding: .15rem .4rem; border-radius: 4px; font-si .tab.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; } .tab:hover { color: var(--primary); } +/* Profile cards */ +.profile-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 1rem; } +.profile-card { background: var(--card-bg); border: 1px solid var(--border); border-radius: 10px; padding: 1.25rem; transition: box-shadow .15s; } +.profile-card:hover { box-shadow: 0 4px 16px rgba(0,0,0,.08); } +.profile-card-header { margin-bottom: 1rem; } +.profile-card-name { font-size: 1.1rem; font-weight: 700; display: flex; align-items: center; gap: .4rem; } +.icon-btn { background: none; border: none; cursor: pointer; font-size: .85rem; padding: 0; opacity: .5; transition: opacity .15s; } +.icon-btn:hover { opacity: 1; } +.profile-card-stats { display: flex; gap: 1.25rem; margin-bottom: 1rem; padding: .75rem 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); } +.stat { display: flex; flex-direction: column; align-items: center; } +.stat-value { font-size: 1.1rem; font-weight: 700; } +.stat-label { font-size: .75rem; color: var(--text-muted); } +.badge-sent-text { color: var(--sent); } +.badge-delivered-text { color: var(--delivered); } +.badge-received-text { color: var(--received); } +.profile-card-footer { display: flex; align-items: center; justify-content: space-between; } +.profile-card-date { font-size: .8rem; color: var(--text-muted); } +.profile-card-actions { display: flex; gap: .5rem; align-items: center; } +.rename-form { display: inline-flex; gap: .35rem; align-items: center; } +.rename-form input { width: 140px; padding: .25rem .5rem; font-size: .85rem; } +.empty-state { text-align: center; padding: 3rem 1rem; color: var(--text-muted); } +.empty-icon { font-size: 3rem; margin-bottom: .75rem; } +.empty-sub { font-size: .85rem; margin-top: .25rem; } + /* Postcard row */ .postcard-row { display: flex; align-items: center; gap: 1rem; padding: .75rem; border: 1px solid var(--border); border-radius: 8px; background: var(--card-bg); margin-bottom: .5rem; text-decoration: none; color: var(--text); transition: box-shadow .15s; } .postcard-row:hover { box-shadow: 0 2px 8px rgba(0,0,0,.08); text-decoration: none; } diff --git a/app/templates/profiles.html b/app/templates/profiles.html index 189c958..d6dacfe 100644 --- a/app/templates/profiles.html +++ b/app/templates/profiles.html @@ -7,48 +7,77 @@
- +
{% if profiles %} - - - - {% for p in profiles %} - - - - - - {% endfor %} - -
昵称创建时间操作
- {{ p.nickname }} - - {{ p.created_at.strftime('%Y-%m-%d %H:%M') }} - 查看 - +
+ {% for p in profiles %} + {% set e = extras[p.id] %} +
+
+

+ {{ p.nickname }} + +

+ +
+
+
+ {{ e.total }} + 总计 +
+
+ {{ e.sent }} + 已寄出 +
+
+ {{ e.delivered }} + 已送达 +
+
+ {{ e.received }} + 已收到 +
+
+ {{ e.countries }} + 国家 +
+
+
+ + + + {% endfor %} + {% else %} -

还没有 Profile。

+
+
📮
+

还没有 Profile

+

创建一个 Profile 来管理你的明信片吧

+
{% endif %} {% endblock %}