feat: add profile rename, all postcard fields required

This commit is contained in:
2026-07-05 19:00:25 +08:00
parent 5aa8b7e7f2
commit d7850d200f
4 changed files with 32 additions and 15 deletions

View File

@@ -139,6 +139,15 @@ def profile_delete(profile_id: int, user: User = Depends(get_current_user_web),
return _redirect("/profiles")
@router.post("/profiles/{profile_id}/rename")
def profile_rename(profile_id: int, nickname: 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.nickname = nickname
db.commit()
return _redirect("/profiles")
# ---------- Postcards ----------
@router.get("/profiles/{profile_id}/postcards", response_class=HTMLResponse)

View File

@@ -53,6 +53,8 @@ input[type="text"] + label, input[type="password"] + label, input[type="datetime
.form-row .btn { white-space: nowrap; flex-shrink: 0; }
.filter-bar .form-row select { flex: 0 0 auto; width: auto; }
.inline-form { margin-bottom: 1.25rem; }
.rename-form { display: inline-flex; gap: .35rem; align-items: center; margin-right: .5rem; }
.rename-form input[type="text"] { width: 120px; flex: none; }
/* Buttons */
.btn { display: inline-block; padding: .5rem 1rem; border: 1px solid var(--border); border-radius: 6px; background: #fff; cursor: pointer; font-size: .9rem; text-align: center; white-space: nowrap; }

View File

@@ -9,28 +9,28 @@
<input type="text" name="card_number" value="{{ postcard.card_number if postcard else '' }}" required pattern="[A-Za-z]{2}-\d{7}" title="两个字母 + 短横线 + 7位数字如 AB-1234567">
<label>状态 *</label>
<select name="status" id="status-select" onchange="toggleFields()">
<select name="status" id="status-select" onchange="toggleFields()" required>
<option value="sent" {% if postcard and postcard.status=='sent' %}selected{% endif %}>已寄出</option>
<option value="delivered" {% if postcard and postcard.status=='delivered' %}selected{% endif %}>已送达</option>
<option value="received" {% if postcard and postcard.status=='received' %}selected{% endif %}>已收到</option>
</select>
<div id="fields-sent-delivered">
<label>收件人</label>
<input type="text" name="recipient_name" value="{{ postcard.recipient_name if postcard else '' }}">
<label>国家/地区</label>
<input type="text" name="country" value="{{ postcard.country if postcard else '' }}" pattern="[A-Z]{2}" title="两个大写字母(如 JP、US" maxlength="2" style="width:80px;text-transform:uppercase">
<label>寄出时间</label>
<input type="date" name="send_time" value="{{ postcard.send_time.strftime('%Y-%m-%d') if postcard and postcard.send_time else '' }}">
<label>到达时间</label>
<input type="date" name="arrival_time" value="{{ postcard.arrival_time.strftime('%Y-%m-%d') if postcard and postcard.arrival_time else '' }}">
<label>收件人 *</label>
<input type="text" name="recipient_name" value="{{ postcard.recipient_name if postcard else '' }}" required>
<label>国家/地区 *</label>
<input type="text" name="country" value="{{ postcard.country if postcard else '' }}" required pattern="[A-Z]{2}" title="两个大写字母(如 JP、US" maxlength="2" style="width:80px;text-transform:uppercase">
<label>寄出时间 *</label>
<input type="date" name="send_time" value="{{ postcard.send_time.strftime('%Y-%m-%d') if postcard and postcard.send_time else '' }}" required>
<label>到达时间 *</label>
<input type="date" name="arrival_time" value="{{ postcard.arrival_time.strftime('%Y-%m-%d') if postcard and postcard.arrival_time else '' }}" required>
</div>
<div id="fields-received" style="display:none">
<label>发件人</label>
<input type="text" name="sender_name" value="{{ postcard.sender_name if postcard else '' }}">
<label>收到时间</label>
<input type="date" name="receive_time" value="{{ postcard.receive_time.strftime('%Y-%m-%d') if postcard and postcard.receive_time else '' }}">
<label>发件人 *</label>
<input type="text" name="sender_name" value="{{ postcard.sender_name if postcard else '' }}" required>
<label>收到时间 *</label>
<input type="date" name="receive_time" value="{{ postcard.receive_time.strftime('%Y-%m-%d') if postcard and postcard.receive_time else '' }}" required>
</div>
<div class="form-actions">
@@ -41,8 +41,10 @@
<script>
function toggleFields() {
var s = document.getElementById('status-select').value;
document.getElementById('fields-sent-delivered').style.display = (s === 'received') ? 'none' : '';
document.getElementById('fields-received').style.display = (s === 'received') ? '' : 'none';
var sd = document.getElementById('fields-sent-delivered');
var rc = document.getElementById('fields-received');
sd.style.display = (s === 'received') ? 'none' : '';
rc.style.display = (s === 'received') ? '' : 'none';
}
toggleFields();
</script>

View File

@@ -19,6 +19,10 @@
<td><a href="/profiles/{{ p.id }}/postcards">{{ p.nickname }}</a></td>
<td>{{ p.created_at.strftime('%Y-%m-%d %H:%M') }}</td>
<td>
<form method="post" action="/profiles/{{ p.id }}/rename" class="inline rename-form">
<input type="text" name="nickname" value="{{ p.nickname }}" required>
<button type="submit" class="btn btn-sm">改名</button>
</form>
<form method="post" action="/profiles/{{ p.id }}/delete" class="inline">
<button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('确定删除该 Profile 及其所有明信片?')">删除</button>
</form>