Files
LoveACE-EndF/router/user/model.py

79 lines
3.4 KiB
Python
Raw Normal View History

2025-08-03 16:50:56 +08:00
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