From a85df3c6e08ae1179bf364435a81619fe6da96be Mon Sep 17 00:00:00 2001 From: xingc Date: Tue, 29 Apr 2025 16:49:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(user):=20=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BF=A1=E6=81=AF=EF=BC=88=E8=AE=BF=E9=97=AE=E8=80=85?= =?UTF-8?q?=EF=BC=89=E8=BF=94=E5=9B=9E=E6=98=AF=E5=90=A6=E5=85=B3=E6=B3=A8?= =?UTF-8?q?`is=5Ffollow`=20CRUD=E5=90=8C=E6=AD=A5=E6=96=B0=E5=A2=9E`exists?= =?UTF-8?q?`=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/db/crud.py | 9 +++++++++ core/routers/user/routes.py | 23 ++++++++++++++++++----- core/routers/user/schema.py | 4 ++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/core/db/crud.py b/core/db/crud.py index d7a9901..5b7b1bb 100644 --- a/core/db/crud.py +++ b/core/db/crud.py @@ -152,6 +152,15 @@ class CRUD: await self.session.commit() return result.rowcount > 0 + async def exists(self, filters: dict, model: Model = None) -> bool: + model = model or self.model + + result = await self.session.execute(select(model).filter( + *self.build_filter_conditions(filters, model)) + ) + state = True if result.scalars().first() else False + return state + async def total(self, filters: dict, model: Model = None) -> int: model = model or self.model diff --git a/core/routers/user/routes.py b/core/routers/user/routes.py index 06cb6ad..d28ab70 100644 --- a/core/routers/user/routes.py +++ b/core/routers/user/routes.py @@ -18,7 +18,6 @@ from core.routers.auth.schema import LoginUser from core.routers.auth.services import get_current_user_form_http from . import schema -from .schema import UpdateUserIn user_router = APIRouter(prefix='/user', tags=['用户模块']) @@ -45,7 +44,7 @@ async def get_me_info( @user_router.get( '/visit/{user_id}/info', summary='用户信息(访问者)', - response_model=base_schema.BaseResponse[schema.LiteUser] + response_model=base_schema.BaseResponse[schema.VisitUser] ) async def get_visit_user_info( user_id: int, @@ -59,6 +58,22 @@ async def get_visit_user_info( user = await db_crud.get(filters={'user_id': user_id}) if user is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail='访问用户不存在') + + user.is_follow = await db_crud.exists( + model=UserFollows, + filters={ + 'follower_id': login_user.user_id, + 'followed_id': user_id + } + ) + + user.displayed_card_total = await db_crud.total( + model=UserCollection, + filters={ + 'user_id': user.user_id, + 'displayed': True} + ) + return {'data': user} @@ -136,12 +151,10 @@ async def follow_user( if follower_user is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail='被关注者不存在') - user: User | None = await db_crud.get(filters={'user_id': login_user.user_id}) - db_crud = CRUD(db_session, UserFollows) record = { 'follower_id': login_user.user_id, - 'followed_id': user.user_id, + 'followed_id': follower_user.user_id, } if action == 'follower': await db_crud.create(data=record, filters=record) diff --git a/core/routers/user/schema.py b/core/routers/user/schema.py index 2666a51..35b20e7 100644 --- a/core/routers/user/schema.py +++ b/core/routers/user/schema.py @@ -30,6 +30,10 @@ class LiteUser(BaseModel): gender: Optional[int] = None avatar_url: Optional[str] = None vip_expire_date: Optional[date] = None + + +class VisitUser(LiteUser): + is_follow: Optional[bool] = False displayed_card_total: Optional[int] = 0