announcements.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. """
  2. 公告管理接口
  3. """
  4. from fastapi import APIRouter, Depends
  5. from sqlalchemy.orm import Session
  6. from pydantic import BaseModel
  7. from app.database import get_db
  8. from app.api.deps import get_current_admin
  9. from app.models.announcement import Announcement
  10. from datetime import datetime
  11. router = APIRouter()
  12. class AnnouncementCreate(BaseModel):
  13. """创建公告请求"""
  14. title: str
  15. content: str
  16. priority: int = 0
  17. is_active: bool = True
  18. publish_time: str = None # ISO格式时间字符串
  19. @router.get("")
  20. async def get_announcements(
  21. db: Session = Depends(get_db),
  22. current_admin = Depends(get_current_admin)
  23. ):
  24. """获取公告列表"""
  25. announcements = db.query(Announcement).all()
  26. return {
  27. "code": 200,
  28. "msg": "成功",
  29. "data": [
  30. {
  31. "id": a.id,
  32. "title": a.title,
  33. "content": a.content,
  34. "priority": a.priority,
  35. "is_active": bool(a.is_active),
  36. "publish_time": a.publish_time.isoformat() if a.publish_time else None,
  37. "created_at": a.created_at.isoformat() if a.created_at else None,
  38. "updated_at": a.updated_at.isoformat() if a.updated_at else None
  39. }
  40. for a in announcements
  41. ]
  42. }
  43. @router.get("/{announcement_id}")
  44. async def get_announcement_detail(
  45. announcement_id: int,
  46. db: Session = Depends(get_db),
  47. current_admin = Depends(get_current_admin)
  48. ):
  49. """获取公告详情"""
  50. announcement = db.query(Announcement).filter(Announcement.id == announcement_id).first()
  51. if not announcement:
  52. return {"code": 404, "msg": "公告不存在"}
  53. return {
  54. "code": 200,
  55. "msg": "成功",
  56. "data": {
  57. "id": announcement.id,
  58. "title": announcement.title,
  59. "content": announcement.content,
  60. "priority": announcement.priority,
  61. "is_active": bool(announcement.is_active),
  62. "publish_time": announcement.publish_time.isoformat() if announcement.publish_time else None,
  63. "created_at": announcement.created_at.isoformat() if announcement.created_at else None,
  64. "updated_at": announcement.updated_at.isoformat() if announcement.updated_at else None
  65. }
  66. }
  67. @router.post("")
  68. async def create_announcement(
  69. req: AnnouncementCreate,
  70. db: Session = Depends(get_db),
  71. current_admin = Depends(get_current_admin)
  72. ):
  73. """创建公告"""
  74. publish_time = datetime.now()
  75. if req.publish_time:
  76. try:
  77. publish_time = datetime.fromisoformat(req.publish_time.replace('Z', '+00:00'))
  78. except:
  79. pass
  80. announcement = Announcement(
  81. title=req.title,
  82. content=req.content,
  83. priority=req.priority,
  84. is_active=1 if req.is_active else 0,
  85. publish_time=publish_time,
  86. created_at=datetime.now(),
  87. updated_at=datetime.now()
  88. )
  89. db.add(announcement)
  90. db.commit()
  91. return {"code": 200, "msg": "创建成功", "data": {"id": announcement.id}}
  92. @router.put("/{announcement_id}")
  93. async def update_announcement(
  94. announcement_id: int,
  95. req: AnnouncementCreate,
  96. db: Session = Depends(get_db),
  97. current_admin = Depends(get_current_admin)
  98. ):
  99. """更新公告"""
  100. announcement = db.query(Announcement).filter(Announcement.id == announcement_id).first()
  101. if not announcement:
  102. return {"code": 404, "msg": "公告不存在"}
  103. announcement.title = req.title
  104. announcement.content = req.content
  105. announcement.priority = req.priority
  106. announcement.is_active = 1 if req.is_active else 0
  107. if req.publish_time:
  108. try:
  109. announcement.publish_time = datetime.fromisoformat(req.publish_time.replace('Z', '+00:00'))
  110. except:
  111. pass
  112. announcement.updated_at = datetime.now()
  113. db.commit()
  114. return {"code": 200, "msg": "更新成功"}
  115. @router.put("/{announcement_id}/status")
  116. async def toggle_announcement_status(
  117. announcement_id: int,
  118. db: Session = Depends(get_db),
  119. current_admin = Depends(get_current_admin)
  120. ):
  121. """切换公告状态"""
  122. announcement = db.query(Announcement).filter(Announcement.id == announcement_id).first()
  123. if not announcement:
  124. return {"code": 404, "msg": "公告不存在"}
  125. announcement.is_active = 0 if announcement.is_active else 1
  126. announcement.updated_at = datetime.now()
  127. db.commit()
  128. return {"code": 200, "msg": "状态更新成功", "data": {"is_active": bool(announcement.is_active)}}
  129. @router.delete("/{announcement_id}")
  130. async def delete_announcement(
  131. announcement_id: int,
  132. db: Session = Depends(get_db),
  133. current_admin = Depends(get_current_admin)
  134. ):
  135. """删除公告"""
  136. announcement = db.query(Announcement).filter(Announcement.id == announcement_id).first()
  137. if not announcement:
  138. return {"code": 404, "msg": "公告不存在"}
  139. db.delete(announcement)
  140. db.commit()
  141. return {"code": 200, "msg": "删除成功"}