feat: 初始化孕育无忧全栈项目基础代码结构
完成项目初始搭建,包含后端FastAPI+MongoDB服务、前端React+Vite项目的完整基础结构,添加各类配置文件与依赖清单,涵盖核心业务初始框架。
This commit is contained in:
84
backend/app/routers/user.py
Normal file
84
backend/app/routers/user.py
Normal file
@@ -0,0 +1,84 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from app.middleware.auth import get_current_user
|
||||
from app.models.user import User
|
||||
from app.schemas.user import (
|
||||
OnboardingRequest,
|
||||
UserProfileUpdate,
|
||||
UserProfileResponse,
|
||||
)
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
def _user_to_response(user: User) -> UserProfileResponse:
|
||||
return UserProfileResponse(
|
||||
id=str(user.id),
|
||||
name=user.name,
|
||||
phone=user.phone,
|
||||
age=user.age,
|
||||
height=user.height,
|
||||
pre_pregnancy_weight=user.pre_pregnancy_weight,
|
||||
current_weight=user.current_weight,
|
||||
blood_type=user.blood_type,
|
||||
allergies=user.allergies,
|
||||
medical_history=user.medical_history,
|
||||
last_period_date=user.last_period_date,
|
||||
due_date=user.due_date,
|
||||
pregnancy_week=user.pregnancy_week,
|
||||
pregnancy_day=user.pregnancy_day,
|
||||
multiple_pregnancy=user.multiple_pregnancy,
|
||||
pregnancy_count=user.pregnancy_count,
|
||||
emergency_contact=user.emergency_contact.model_dump() if user.emergency_contact else None,
|
||||
is_onboarded=user.is_onboarded,
|
||||
avatar_url=user.avatar_url,
|
||||
created_at=user.created_at,
|
||||
)
|
||||
|
||||
|
||||
@router.get("/profile", response_model=UserProfileResponse)
|
||||
async def get_profile(user: User = Depends(get_current_user)):
|
||||
"""获取用户信息"""
|
||||
return _user_to_response(user)
|
||||
|
||||
|
||||
@router.post("/onboarding", response_model=UserProfileResponse)
|
||||
async def complete_onboarding(
|
||||
req: OnboardingRequest, user: User = Depends(get_current_user)
|
||||
):
|
||||
"""完成用户画像设置"""
|
||||
user.name = req.name or user.name
|
||||
user.age = req.age
|
||||
user.height = req.height
|
||||
user.pre_pregnancy_weight = req.pre_pregnancy_weight
|
||||
user.current_weight = req.current_weight
|
||||
user.blood_type = req.blood_type
|
||||
user.allergies = req.allergies
|
||||
user.medical_history = req.medical_history
|
||||
user.last_period_date = req.last_period_date
|
||||
user.due_date = req.due_date
|
||||
user.pregnancy_week = req.pregnancy_week
|
||||
user.pregnancy_day = req.pregnancy_day
|
||||
user.multiple_pregnancy = req.multiple_pregnancy
|
||||
user.pregnancy_count = req.pregnancy_count
|
||||
if req.emergency_contact:
|
||||
user.emergency_contact = req.emergency_contact
|
||||
user.is_onboarded = True
|
||||
user.updated_at = datetime.now(timezone.utc)
|
||||
await user.save()
|
||||
return _user_to_response(user)
|
||||
|
||||
|
||||
@router.put("/profile", response_model=UserProfileResponse)
|
||||
async def update_profile(
|
||||
req: UserProfileUpdate, user: User = Depends(get_current_user)
|
||||
):
|
||||
"""更新用户信息"""
|
||||
update_data = req.model_dump(exclude_unset=True)
|
||||
for field, value in update_data.items():
|
||||
setattr(user, field, value)
|
||||
user.updated_at = datetime.now(timezone.utc)
|
||||
await user.save()
|
||||
return _user_to_response(user)
|
||||
Reference in New Issue
Block a user