Files
LoveACE-EndF/router/user/model.py
2025-08-03 16:50:56 +08:00

79 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from pydantic import BaseModel, Field, field_validator
from router.common_model import BaseResponse
from typing import Optional, Dict, Any, Union
import json
class UserSettings(BaseModel):
"""用户设置模型"""
theme: str = Field(..., description="主题模式")
lightModeOpacity: float = Field(..., description="浅色模式透明度", ge=0.0, le=1.0)
lightModeBrightness: float = Field(..., description="浅色模式亮度", ge=0.0, le=1.0)
darkModeOpacity: float = Field(..., description="深色模式透明度", ge=0.0, le=1.0)
darkModeBrightness: float = Field(..., description="深色模式亮度", ge=0.0, le=1.0)
backgroundBlur: float = Field(..., description="背景模糊强度", ge=0.0, le=1.0)
@field_validator('theme')
def validate_theme(cls, v):
"""验证主题值"""
valid_themes = ['light', 'dark', 'system', 'ThemeMode.light', 'ThemeMode.dark', 'ThemeMode.system']
if v not in valid_themes:
raise ValueError(f"无效的主题值: {v},有效值: {valid_themes}")
return v
class UserProfileData(BaseModel):
"""用户资料数据模型"""
userid: str = Field(..., description="用户ID")
avatar: Optional[str] = Field(None, description="用户头像base64数据")
background: Optional[str] = Field(None, description="用户背景base64数据")
nickname: Optional[str] = Field(None, description="用户昵称")
settings: Optional[UserSettings] = Field(None, description="用户设置对象")
class GetUserProfileRequest(BaseModel):
"""获取用户资料请求模型"""
token: str = Field(..., description="用户认证token")
class UpdateUserProfileRequest(BaseModel):
"""更新用户资料请求模型"""
token: str = Field(..., description="用户认证token")
avatar: Optional[str] = Field(None, description="用户头像base64编码数据")
background: Optional[str] = Field(None, description="用户背景base64编码数据")
nickname: Optional[str] = Field(None, description="用户昵称")
settings: Optional[Union[UserSettings, str]] = Field(None, description="用户设置对象或JSON字符串")
@field_validator('settings')
def parse_settings(cls, v):
"""解析settings字段支持字符串和对象两种格式"""
if v is None:
return v
# 如果已经是UserSettings对象直接返回
if isinstance(v, UserSettings):
return v
# 如果是字符串尝试解析为JSON然后创建UserSettings对象
if isinstance(v, str):
try:
settings_dict = json.loads(v)
return UserSettings(**settings_dict)
except json.JSONDecodeError as e:
raise ValueError(f"settings字段JSON格式错误: {str(e)}")
except Exception as e:
raise ValueError(f"settings字段验证失败: {str(e)}")
# 如果是字典直接创建UserSettings对象
if isinstance(v, dict):
try:
return UserSettings(**v)
except Exception as e:
raise ValueError(f"settings字段验证失败: {str(e)}")
raise ValueError("settings字段必须是JSON字符串、字典或UserSettings对象")
class UserProfileResponse(BaseResponse[UserProfileData]):
"""用户资料响应模型"""
pass