From bceb4f46192025808dc460d2d3b729420287b079 Mon Sep 17 00:00:00 2001 From: Karlcarlo Date: Wed, 27 May 2026 20:24:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E4=BB=8E=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E8=8E=B7=E5=8F=96=E5=BE=AE=E4=BF=A1=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E5=92=8C=E6=98=B5=E7=A7=B0=E5=90=8C=E6=AD=A5=E5=88=B0?= =?UTF-8?q?=20H5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端 UserProfileUpdate 新增 avatar_url 字段 - LoginPage 检测 URL 参数 name/avatar 并调用 updateUserProfile - ProfilePage 头像卡片显示真实头像(有 avatar_url 时) - ProfilePage 增加 基本信息-姓名 编辑字段 --- backend/app/schemas/user.py | 1 + frontend/src/app/pages/LoginPage.tsx | 14 ++++++++++- frontend/src/app/pages/ProfilePage.tsx | 32 +++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/backend/app/schemas/user.py b/backend/app/schemas/user.py index c7d4876..9ebfb45 100644 --- a/backend/app/schemas/user.py +++ b/backend/app/schemas/user.py @@ -27,6 +27,7 @@ class UserProfileUpdate(BaseModel): multiple_pregnancy: Optional[str] = None pregnancy_count: Optional[int] = None emergency_contact: Optional[EmergencyContactSchema] = None + avatar_url: Optional[str] = None class OnboardingRequest(BaseModel): diff --git a/frontend/src/app/pages/LoginPage.tsx b/frontend/src/app/pages/LoginPage.tsx index b339675..43a3190 100644 --- a/frontend/src/app/pages/LoginPage.tsx +++ b/frontend/src/app/pages/LoginPage.tsx @@ -3,7 +3,7 @@ import { useNavigate } from "react-router"; import { motion } from "motion/react"; import { Heart } from "lucide-react"; import { useUser } from "../context/UserContext"; -import { devLogin, createDummyToken } from "../services/api"; +import { devLogin, createDummyToken, updateUserProfile } from "../services/api"; import { debugLog, clearDebugLogs } from "../services/debug"; export function LoginPage() { @@ -35,6 +35,18 @@ export function LoginPage() { setTokenAndUser(token, { id: String(uid), openid: openidParam, phone }); debugLog(`setTokenAndUser: id=${uid}, openid=${openidParam}, phone=${phone}`); + // 同步昵称和头像到后端 + const nameParam = params.get('name'); + const avatarParam = params.get('avatar'); + if (nameParam || avatarParam) { + const updateData: Record = {}; + if (nameParam) updateData.name = decodeURIComponent(nameParam); + if (avatarParam) updateData.avatar_url = decodeURIComponent(avatarParam); + updateUserProfile(updateData).then(() => { + debugLog(`synced: name=${nameParam}, avatar=${(avatarParam || '').substring(0, 30)}...`); + }).catch((e) => debugLog(`sync error: ${e.message}`)); + } + fetchProfile().then((dto) => { if (dto) debugLog(`fetchProfile: name=${dto.name}, phone=${dto.phone}, onboarded=${dto.is_onboarded}`); navigate(dto?.is_onboarded ? "/home" : "/onboarding", { replace: true }); diff --git a/frontend/src/app/pages/ProfilePage.tsx b/frontend/src/app/pages/ProfilePage.tsx index df5a785..cfab072 100644 --- a/frontend/src/app/pages/ProfilePage.tsx +++ b/frontend/src/app/pages/ProfilePage.tsx @@ -32,6 +32,7 @@ interface UserInfo { phone: string; email: string; address: string; + avatar_url: string | null; lastPeriod: string; dueDate: string; currentWeek: number; @@ -59,6 +60,7 @@ export function ProfilePage() { phone: user.phone || "未设置", email: "", address: "", + avatar_url: user.avatar_url || null, lastPeriod: user.lastPeriodDate || "", dueDate: user.dueDate || "", currentWeek: user.currentWeek, @@ -232,9 +234,13 @@ export function ProfilePage() {
-
- -
+ {userInfo.avatar_url ? ( + 头像 + ) : ( +
+ +
+ )} @@ -252,6 +258,26 @@ export function ProfilePage() { + {/* 基本信息 */} + +

+ + 基本信息 +

+ + + +
+ {/* 孕期信息 */}