51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
"""常用数据库操作封装。"""
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models.user import User
|
|
|
|
|
|
def _default_nickname(phone: str) -> str:
|
|
suffix = phone[-4:] if len(phone) >= 4 else phone
|
|
return f"用户{suffix}"
|
|
|
|
|
|
async def get_user_by_phone(db: AsyncSession, phone: str) -> Optional[User]:
|
|
"""根据手机号查询用户。"""
|
|
stmt = select(User).where(User.phone == phone)
|
|
result = await db.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
|
|
async def get_user_by_id(db: AsyncSession, user_id: str) -> Optional[User]:
|
|
"""根据ID查询用户。"""
|
|
stmt = select(User).where(User.id == user_id)
|
|
result = await db.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
|
|
async def create_user(
|
|
db: AsyncSession, phone: str, nickname: Optional[str] = None, avatar_url: str = ""
|
|
) -> User:
|
|
"""创建新用户。"""
|
|
user = User(
|
|
phone=phone,
|
|
nickname=nickname or _default_nickname(phone),
|
|
avatar_url=avatar_url or "",
|
|
)
|
|
db.add(user)
|
|
await db.commit()
|
|
await db.refresh(user)
|
|
return user
|
|
|
|
|
|
async def touch_last_login(db: AsyncSession, user: User) -> None:
|
|
"""更新用户最近登录时间。"""
|
|
user.last_login = datetime.utcnow()
|
|
await db.commit()
|
|
|