feat: 增加查询记录带上是否点赞的功能

This commit is contained in:
2026-09-12 16:28:03 +08:00
parent 8ed800f083
commit 2f7a5240be
3 changed files with 34 additions and 29 deletions

View File

@@ -14,18 +14,14 @@ def create(record_in: RecordCreate, db: Session = Depends(get_db)):
return record_service.create_record(db, record_in) return record_service.create_record(db, record_in)
@router.get("", response_model=List[RecordResponse], summary="获取所有记录")
def list_all(skip: int = 0, limit: int = 20, db: Session = Depends(get_db)):
return record_service.get_all_records(db, skip, limit)
@router.get("/page", response_model=RecordPageResponse, summary="分页获取所有记录") @router.get("/page", response_model=RecordPageResponse, summary="分页获取所有记录")
def list_all_by_page( def list_all_by_page(
user_id: int,
page: int = Query(1, ge=1, description="页码从1开始"), page: int = Query(1, ge=1, description="页码从1开始"),
size: int = Query(20, ge=1, le=100, description="每页条数最大100"), size: int = Query(20, ge=1, le=100, description="每页条数最大100"),
db: Session = Depends(get_db), db: Session = Depends(get_db),
): ):
return record_service.get_all_records_by_page(db, page, size) return record_service.get_all_records_by_page(db, user_id, page, size)
@router.get("/{record_id}", response_model=RecordResponse, summary="获取记录详情") @router.get("/{record_id}", response_model=RecordResponse, summary="获取记录详情")

View File

@@ -27,6 +27,7 @@ class RecordResponse(BaseModel):
image_list: List[str] image_list: List[str]
video_list: List[str] video_list: List[str]
like_count: int like_count: int
liked: bool = False
comment_count: int comment_count: int
comments: List[CommentResponse] = [] comments: List[CommentResponse] = []
create_time: datetime create_time: datetime

View File

@@ -1,29 +1,18 @@
from sqlalchemy import select, desc, func from sqlalchemy import select, func
from sqlalchemy.orm import Session, selectinload from sqlalchemy.orm import Session, selectinload
from models.family import Records, Comments from models.family import Records, Comments, Likes
from schemas.record import RecordCreate, RecordUpdate, RecordResponse, RecordPageResponse from schemas.record import RecordCreate, RecordUpdate, RecordResponse, RecordPageResponse
def get_all_records(db: Session, skip: int = 0, limit: int = 20) -> list[RecordResponse]: def get_all_records_by_page(db: Session, user_id: int, page: int = 1, size: int = 20) -> RecordPageResponse:
result = db.execute( base_query = (
select(Records) select(Records)
.options( .options(
selectinload(Records.user), selectinload(Records.user),
selectinload(Records.comments).selectinload(Comments.user), selectinload(Records.comments).selectinload(Comments.user),
) )
.order_by(desc(Records.create_time)) .order_by(Records.create_time.desc())
.offset(skip)
.limit(limit)
)
records = result.scalars().all()
return [RecordResponse.model_validate(r) for r in records]
def get_all_records_by_page(db: Session, page: int = 1, size: int = 20) -> RecordPageResponse:
base_query = select(Records).options(
selectinload(Records.user),
selectinload(Records.comments).selectinload(Comments.user),
) )
# 总数 # 总数
@@ -32,15 +21,34 @@ def get_all_records_by_page(db: Session, page: int = 1, size: int = 20) -> Recor
) )
# 分页数据 # 分页数据
records = db.execute( records = (
base_query db.execute(base_query.offset((page - 1) * size).limit(size))
.order_by(Records.create_time.desc()) .scalars()
.offset((page - 1) * size) .all()
.limit(size) )
).scalars().all()
# 批量判断当前用户点赞状态
liked_record_ids: set[int] = set()
if user_id and records:
liked_record_ids = set(
db.scalars(
select(Likes.record_id).where(
Likes.record_id.in_([r.id for r in records]),
Likes.user_id == user_id,
)
).all()
)
# 组装响应
response_records = []
for r in records:
resp = RecordResponse.model_validate(r, from_attributes=True)
resp.liked = r.id in liked_record_ids
response_records.append(resp)
return RecordPageResponse( return RecordPageResponse(
records=[RecordResponse.model_validate(r) for r in records], records=response_records,
total=total, total=total,
page=page, page=page,
size=size, size=size,