| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """
- 公告接口(客户端使用)
- """
- from typing import Optional
- from fastapi import APIRouter, Depends, Query
- from sqlalchemy.orm import Session
- from sqlalchemy import or_
- from app.database import get_db
- from app.models.announcement import Announcement
- router = APIRouter()
- @router.get("")
- async def get_announcement(
- page: int = Query(1, ge=1),
- page_size: int = Query(10, ge=1, le=100),
- keyword: Optional[str] = Query(None, description="搜索关键词(标题、内容)"),
- db: Session = Depends(get_db),
- ):
- """获取公告列表(支持检索与分页),按发布时间倒序"""
- offset = (page - 1) * page_size
- query = db.query(Announcement).filter(Announcement.is_active == 1)
- if keyword:
- like_pattern = f"%{keyword}%"
- query = query.filter(
- or_(
- Announcement.title.like(like_pattern),
- Announcement.content.like(like_pattern),
- )
- )
- # 按发布时间倒序,其次按ID倒序,确保最新的在最前面
- # 这里不使用 nullslast,以避免部分数据库方言不支持导致的错误
- query = query.order_by(Announcement.publish_time.desc(), Announcement.id.desc())
- total = query.count()
- announcements = query.offset(offset).limit(page_size).all()
- return {
- "code": 200,
- "msg": "成功",
- "data": [
- {
- "id": a.id,
- "title": a.title,
- "content": a.content,
- "publish_time": a.publish_time.isoformat() if a.publish_time else None,
- }
- for a in announcements
- ],
- "total": total,
- "page": page,
- "page_size": page_size,
- }
|