user.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. """
  2. 用户模型
  3. """
  4. from datetime import datetime
  5. from typing import Optional, List
  6. from pydantic import BaseModel, Field
  7. from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean
  8. from sqlalchemy.ext.declarative import declarative_base
  9. Base = declarative_base()
  10. class UserDB(Base):
  11. """用户数据库模型"""
  12. __tablename__ = "users"
  13. id = Column(Integer, primary_key=True, index=True)
  14. username = Column(String(50), unique=True, index=True, nullable=False)
  15. email = Column(String(100), unique=True, index=True, nullable=False)
  16. hashed_password = Column(String(255), nullable=False)
  17. full_name = Column(String(100))
  18. institution = Column(String(200))
  19. research_field = Column(String(100))
  20. preferences = Column(Text) # JSON格式存储用户偏好
  21. is_active = Column(Boolean, default=True)
  22. is_premium = Column(Boolean, default=False)
  23. created_at = Column(DateTime, default=datetime.utcnow)
  24. updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
  25. class User(BaseModel):
  26. """用户响应模型"""
  27. id: int
  28. username: str
  29. email: str
  30. full_name: Optional[str] = None
  31. institution: Optional[str] = None
  32. research_field: Optional[str] = None
  33. is_active: bool = True
  34. is_premium: bool = False
  35. created_at: datetime
  36. class Config:
  37. from_attributes = True
  38. class UserCreate(BaseModel):
  39. """用户创建模型"""
  40. username: str = Field(..., min_length=3, max_length=50)
  41. email: str = Field(..., regex=r'^[^@]+@[^@]+\.[^@]+$')
  42. password: str = Field(..., min_length=6)
  43. full_name: Optional[str] = None
  44. institution: Optional[str] = None
  45. research_field: Optional[str] = None
  46. class UserUpdate(BaseModel):
  47. """用户更新模型"""
  48. full_name: Optional[str] = None
  49. institution: Optional[str] = None
  50. research_field: Optional[str] = None
  51. preferences: Optional[str] = None
  52. class UserPreferences(BaseModel):
  53. """用户偏好设置"""
  54. research_interests: List[str] = []
  55. citation_style: str = "APA"
  56. language: str = "zh"
  57. notification_enabled: bool = True
  58. auto_save: bool = True