20251222
This commit is contained in:
120
Server/app/api/v1/user_profile.py
Normal file
120
Server/app/api/v1/user_profile.py
Normal file
@@ -0,0 +1,120 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
用户资料接口
|
||||
功能:获取和更新用户资料
|
||||
"""
|
||||
|
||||
from fastapi import APIRouter, HTTPException, Depends
|
||||
from pydantic import BaseModel
|
||||
from typing import Optional
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import func
|
||||
from app.db import get_db
|
||||
from app.models.user import User
|
||||
from app.models.business import PointsHistory
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
# ==================== 数据模型 ====================
|
||||
|
||||
class UserProfileUpdate(BaseModel):
|
||||
username: str
|
||||
nickname: Optional[str] = None
|
||||
avatar: Optional[str] = None
|
||||
email: Optional[str] = None
|
||||
|
||||
# ==================== 用户资料管理 ====================
|
||||
|
||||
@router.get("/user/profile")
|
||||
async def get_user_profile(username: str, db: Session = Depends(get_db)):
|
||||
"""获取用户资料"""
|
||||
user = db.query(User).filter(User.username == username).first()
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail="用户不存在")
|
||||
|
||||
# 转换为字典以便序列化
|
||||
user_data = {
|
||||
"username": user.username,
|
||||
"nickname": user.nickname,
|
||||
"avatar": user.avatar,
|
||||
"email": user.email,
|
||||
"points": user.points,
|
||||
"level": user.level,
|
||||
"vip_type": user.vip_type,
|
||||
"vip_expire": user.vip_expire.isoformat() if user.vip_expire else None,
|
||||
"vip_daily_quota": user.vip_daily_quota,
|
||||
"total_check_in_days": user.total_check_in_days,
|
||||
"consecutive_check_in": user.consecutive_check_in,
|
||||
"created_at": user.created_at.isoformat() if user.created_at else None
|
||||
}
|
||||
|
||||
return {
|
||||
"code": 200,
|
||||
"data": user_data
|
||||
}
|
||||
|
||||
@router.put("/user/profile")
|
||||
async def update_user_profile(data: UserProfileUpdate, db: Session = Depends(get_db)):
|
||||
"""更新用户资料"""
|
||||
user = db.query(User).filter(User.username == data.username).first()
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail="用户不存在")
|
||||
|
||||
if data.nickname is not None:
|
||||
user.nickname = data.nickname
|
||||
if data.avatar is not None:
|
||||
user.avatar = data.avatar
|
||||
if data.email is not None:
|
||||
user.email = data.email
|
||||
|
||||
db.commit()
|
||||
|
||||
return {
|
||||
"code": 200,
|
||||
"message": "更新成功"
|
||||
}
|
||||
|
||||
# ==================== 积分历史 ====================
|
||||
|
||||
@router.get("/points/history")
|
||||
async def get_points_history(
|
||||
username: str,
|
||||
type: Optional[str] = None,
|
||||
page: int = 1,
|
||||
limit: int = 20,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""获取积分历史"""
|
||||
user = db.query(User).filter(User.username == username).first()
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail="用户不存在")
|
||||
|
||||
offset = (page - 1) * limit
|
||||
|
||||
query = db.query(PointsHistory).filter(PointsHistory.user_id == user.id)
|
||||
|
||||
if type:
|
||||
query = query.filter(PointsHistory.type == type)
|
||||
|
||||
total = query.count()
|
||||
records = query.order_by(PointsHistory.created_at.desc()).offset(offset).limit(limit).all()
|
||||
|
||||
result_records = []
|
||||
for record in records:
|
||||
result_records.append({
|
||||
"type": record.type,
|
||||
"amount": record.amount,
|
||||
"balance": record.balance,
|
||||
"description": record.description,
|
||||
"created_at": record.created_at.isoformat() if record.created_at else None
|
||||
})
|
||||
|
||||
return {
|
||||
"code": 200,
|
||||
"data": {
|
||||
"total": total,
|
||||
"current_balance": user.points,
|
||||
"records": result_records
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user