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)
 |