124 lines
3.8 KiB
Python
124 lines
3.8 KiB
Python
from datetime import datetime
|
||
from app.models.user import db, User # 从user模块导入db,而不是从app.models导入
|
||
|
||
|
||
class Announcement(db.Model):
|
||
__tablename__ = 'announcements'
|
||
|
||
id = db.Column(db.Integer, primary_key=True)
|
||
title = db.Column(db.String(128), nullable=False)
|
||
content = db.Column(db.Text, nullable=False)
|
||
publisher_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
|
||
is_top = db.Column(db.Boolean, default=False)
|
||
status = db.Column(db.Integer, default=1) # 1-正常, 0-已下架
|
||
created_at = db.Column(db.DateTime, nullable=False, default=datetime.now)
|
||
updated_at = db.Column(db.DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
|
||
|
||
# 关联关系
|
||
publisher = db.relationship('User', backref='announcements')
|
||
|
||
def to_dict(self):
|
||
"""将公告转换为字典"""
|
||
return {
|
||
'id': self.id,
|
||
'title': self.title,
|
||
'content': self.content,
|
||
'publisher_id': self.publisher_id,
|
||
'publisher_name': self.publisher.username if self.publisher else '',
|
||
'is_top': self.is_top,
|
||
'status': self.status,
|
||
'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
|
||
'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S')
|
||
}
|
||
|
||
@staticmethod
|
||
def get_active_announcements(limit=None):
|
||
"""获取活跃的公告"""
|
||
query = Announcement.query.filter_by(status=1).order_by(
|
||
Announcement.is_top.desc(),
|
||
Announcement.created_at.desc()
|
||
)
|
||
|
||
if limit:
|
||
query = query.limit(limit)
|
||
|
||
return query.all()
|
||
|
||
@staticmethod
|
||
def get_announcement_by_id(announcement_id):
|
||
"""根据ID获取公告"""
|
||
return Announcement.query.get(announcement_id)
|
||
|
||
@staticmethod
|
||
def create_announcement(title, content, publisher_id, is_top=False):
|
||
"""创建新公告"""
|
||
announcement = Announcement(
|
||
title=title,
|
||
content=content,
|
||
publisher_id=publisher_id,
|
||
is_top=is_top
|
||
)
|
||
|
||
try:
|
||
db.session.add(announcement)
|
||
db.session.commit()
|
||
return True, announcement
|
||
except Exception as e:
|
||
db.session.rollback()
|
||
return False, str(e)
|
||
|
||
@staticmethod
|
||
def update_announcement(announcement_id, title, content, is_top=None):
|
||
"""更新公告内容"""
|
||
announcement = Announcement.query.get(announcement_id)
|
||
|
||
if not announcement:
|
||
return False, "公告不存在"
|
||
|
||
announcement.title = title
|
||
announcement.content = content
|
||
|
||
if is_top is not None:
|
||
announcement.is_top = is_top
|
||
|
||
try:
|
||
db.session.commit()
|
||
return True, announcement
|
||
except Exception as e:
|
||
db.session.rollback()
|
||
return False, str(e)
|
||
|
||
@staticmethod
|
||
def change_status(announcement_id, status):
|
||
"""更改公告状态"""
|
||
announcement = Announcement.query.get(announcement_id)
|
||
|
||
if not announcement:
|
||
return False, "公告不存在"
|
||
|
||
announcement.status = status
|
||
|
||
try:
|
||
db.session.commit()
|
||
return True, "状态已更新"
|
||
except Exception as e:
|
||
db.session.rollback()
|
||
return False, str(e)
|
||
|
||
@staticmethod
|
||
def change_top_status(announcement_id, is_top):
|
||
"""更改置顶状态"""
|
||
announcement = Announcement.query.get(announcement_id)
|
||
|
||
if not announcement:
|
||
return False, "公告不存在"
|
||
|
||
announcement.is_top = is_top
|
||
|
||
try:
|
||
db.session.commit()
|
||
return True, "置顶状态已更新"
|
||
except Exception as e:
|
||
db.session.rollback()
|
||
return False, str(e)
|