完成公告 CRUD、公告列表和详情接口 #23
Merged
hnu202326010328
merged 1 commits from wanglirong_branch into develop 5 months ago
@ -0,0 +1,54 @@
|
||||
from typing import Any
|
||||
from fastapi import APIRouter, Depends, Query, HTTPException
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from api.v1.deps import get_db
|
||||
from crud.crud_announcement import crud_announcement
|
||||
from schema.announcement import (
|
||||
AnnouncementListResponse,
|
||||
AnnouncementDetailResponse
|
||||
)
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
# ============================
|
||||
# 1. 获取公告列表
|
||||
# ============================
|
||||
@router.get("/", response_model=AnnouncementListResponse, summary="获取公告列表")
|
||||
async def read_announcements(
|
||||
db: AsyncSession = Depends(get_db),
|
||||
page: int = Query(1, ge=1, description="页码"),
|
||||
page_size: int = Query(10, ge=1, le=100, description="每页数量"),
|
||||
status: str = Query("published", description="公告状态"),
|
||||
) -> Any:
|
||||
|
||||
total, items = await crud_announcement.get_list(
|
||||
db=db,
|
||||
status=status,
|
||||
page=page,
|
||||
page_size=page_size
|
||||
)
|
||||
|
||||
return AnnouncementListResponse(
|
||||
total=total,
|
||||
page=page,
|
||||
page_size=page_size,
|
||||
items=items
|
||||
)
|
||||
|
||||
|
||||
# ============================
|
||||
# 2. 获取公告详情
|
||||
# ============================
|
||||
@router.get("/{announcement_id}", response_model=AnnouncementDetailResponse, summary="获取公告详情")
|
||||
async def get_announcement_detail(
|
||||
announcement_id: int,
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
announcement = await crud_announcement.get(db, announcement_id)
|
||||
|
||||
if not announcement:
|
||||
raise HTTPException(status_code=404, detail="Announcement not found")
|
||||
|
||||
return announcement
|
||||
@ -0,0 +1,34 @@
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from datetime import datetime
|
||||
from typing import List
|
||||
|
||||
|
||||
class AnnouncementBase(BaseModel):
|
||||
title: str
|
||||
content: str
|
||||
status: str
|
||||
|
||||
|
||||
class AnnouncementResponse(BaseModel):
|
||||
announcement_id: int
|
||||
title: str
|
||||
content: str
|
||||
status: str
|
||||
created_at: datetime
|
||||
|
||||
# Pydantic v2 版本的 orm_mode
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class AnnouncementListResponse(BaseModel):
|
||||
total: int
|
||||
page: int
|
||||
page_size: int
|
||||
items: List[AnnouncementResponse]
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class AnnouncementDetailResponse(AnnouncementResponse):
|
||||
"""公告详情"""
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
@ -0,0 +1,44 @@
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from crud.crud_announcement import crud_announcement
|
||||
|
||||
|
||||
class AnnouncementService:
|
||||
|
||||
@staticmethod
|
||||
async def get_announcement_list(
|
||||
db: AsyncSession,
|
||||
status: str | None,
|
||||
page: int,
|
||||
page_size: int
|
||||
):
|
||||
"""
|
||||
获取公告列表
|
||||
"""
|
||||
total, items = await crud_announcement.get_list(
|
||||
db=db,
|
||||
status=status,
|
||||
page=page,
|
||||
page_size=page_size
|
||||
)
|
||||
|
||||
return {
|
||||
"total": total,
|
||||
"page": page,
|
||||
"page_size": page_size,
|
||||
"items": items
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
async def get_announcement_detail(
|
||||
db: AsyncSession,
|
||||
announcement_id: int
|
||||
):
|
||||
"""
|
||||
获取公告详情
|
||||
"""
|
||||
announcement = await crud_announcement.get(db, announcement_id)
|
||||
return announcement
|
||||
|
||||
|
||||
# 单例实例
|
||||
announcement_service = AnnouncementService()
|
||||
Loading…
Reference in new issue