feat(profiles): add private notes field per profile, visible only to owner

This commit is contained in:
2026-07-06 19:36:29 +08:00
parent 233da50554
commit b6d43b3db4
3 changed files with 19 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
from datetime import datetime, timezone from datetime import datetime, timezone
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship, validates from sqlalchemy.orm import relationship, validates
from app.database import Base from app.database import Base
@@ -61,6 +61,7 @@ class Profile(Base):
nickname = Column(String(64), nullable=False) nickname = Column(String(64), nullable=False)
showcase_enabled = Column(default=False, nullable=False) showcase_enabled = Column(default=False, nullable=False)
showcase_visible = Column(String(16), nullable=False, default="both") showcase_visible = Column(String(16), nullable=False, default="both")
notes = Column(Text, nullable=False, default="")
created_at = Column(DateTime, default=_utcnow) created_at = Column(DateTime, default=_utcnow)
user = relationship("User", back_populates="profiles") user = relationship("User", back_populates="profiles")

View File

@@ -451,6 +451,15 @@ def profile_rename(profile_id: int, nickname: str = Form(...), user: User = Depe
return _redirect("/profiles") return _redirect("/profiles")
@router.post("/profiles/{profile_id}/notes")
def profile_notes(profile_id: int, notes: str = Form(""), user: User = Depends(get_current_user_web), db: Session = Depends(get_db)):
p = db.query(Profile).filter(Profile.id == profile_id, Profile.user_id == user.id).first()
if p:
p.notes = notes
db.commit()
return _redirect("/profiles")
# ---------- Postcards ---------- # ---------- Postcards ----------
@router.get("/profiles/{profile_id}/postcards", response_class=HTMLResponse) @router.get("/profiles/{profile_id}/postcards", response_class=HTMLResponse)

View File

@@ -48,6 +48,14 @@
<span class="stat-label">国家</span> <span class="stat-label">国家</span>
</div> </div>
</div> </div>
<div class="profile-card-notes" style="padding:0 .75rem">
<form method="post" action="/profiles/{{ p.id }}/notes" style="display:flex;flex-direction:column;gap:.3rem">
<textarea name="notes" rows="2" placeholder="备注(仅自己可见)" style="width:100%;padding:.4rem .6rem;border:1px solid var(--border);border-radius:6px;font-size:.85rem;resize:vertical;font-family:inherit">{{ p.notes }}</textarea>
<div style="display:flex;justify-content:flex-end">
<button type="submit" class="btn btn-sm">保存</button>
</div>
</form>
</div>
<div class="profile-card-footer"> <div class="profile-card-footer">
<span class="profile-card-date">创建于 {{ p.created_at.strftime('%Y-%m-%d') }}</span> <span class="profile-card-date">创建于 {{ p.created_at.strftime('%Y-%m-%d') }}</span>
<div class="profile-card-actions"> <div class="profile-card-actions">