from sqlalchemy import Column, String, DateTime,Integer, Boolean from sqlalchemy.sql import func from sqlalchemy.dialects.mysql import JSON from pydantic import BaseModel, Field from .database import Base from typing import Optional, List import enum class UserRole(str, enum.Enum): USER = "user" DELIVERYMAN = "deliveryman" ADMIN = "admin" # 数据库模型 class UserDB(Base): __tablename__ = "users" userid = Column(Integer, primary_key=True,autoincrement=True, index=True) username = Column(String(50)) phone = Column(String(11), unique=True, index=True) password = Column(String(128), nullable=True) # 加密后的密码 avatar = Column(String(200), nullable=True) # 头像URL地址 roles = Column(JSON, default=lambda: [UserRole.USER]) # 存储角色列表 create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) # Pydantic 模型 class UserLogin(BaseModel): phone: str = Field(..., pattern="^1[3-9]\d{9}$") verify_code: str = Field(..., min_length=6, max_length=6) class UserInfo(BaseModel): userid: int username: str phone: str avatar: Optional[str] = None roles: List[UserRole] class Config: from_attributes = True class VerifyCodeRequest(BaseModel): phone: str = Field(..., pattern="^1[3-9]\d{9}$") class UserUpdate(BaseModel): username: Optional[str] = Field(None, min_length=2, max_length=50) avatar: Optional[str] = Field(None, max_length=200) class Config: extra = "forbid" # 禁止额外字段 class UserPasswordLogin(BaseModel): phone: str = Field(..., pattern="^1[3-9]\d{9}$") password: str = Field(..., min_length=6, max_length=20)