116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from datetime import datetime
 | 
						||
from app.models.user import db, User  # 从user模块导入db,而不是从app.models导入
 | 
						||
 | 
						||
 | 
						||
class Notification(db.Model):
 | 
						||
    __tablename__ = 'notifications'
 | 
						||
 | 
						||
    id = db.Column(db.Integer, primary_key=True)
 | 
						||
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
 | 
						||
    title = db.Column(db.String(128), nullable=False)
 | 
						||
    content = db.Column(db.Text, nullable=False)
 | 
						||
    type = db.Column(db.String(32), nullable=False)  # 通知类型:system, borrow, return, overdue, etc.
 | 
						||
    status = db.Column(db.Integer, default=0)  # 0-未读, 1-已读
 | 
						||
    sender_id = db.Column(db.Integer, db.ForeignKey('users.id'))
 | 
						||
    created_at = db.Column(db.DateTime, nullable=False, default=datetime.now)
 | 
						||
    read_at = db.Column(db.DateTime)
 | 
						||
 | 
						||
    # 关联关系
 | 
						||
    user = db.relationship('User', foreign_keys=[user_id], backref='notifications')
 | 
						||
    sender = db.relationship('User', foreign_keys=[sender_id], backref='sent_notifications')
 | 
						||
 | 
						||
    def to_dict(self):
 | 
						||
        """将通知转换为字典"""
 | 
						||
        return {
 | 
						||
            'id': self.id,
 | 
						||
            'user_id': self.user_id,
 | 
						||
            'title': self.title,
 | 
						||
            'content': self.content,
 | 
						||
            'type': self.type,
 | 
						||
            'status': self.status,
 | 
						||
            'sender_id': self.sender_id,
 | 
						||
            'sender_name': self.sender.username if self.sender else 'System',
 | 
						||
            'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
 | 
						||
            'read_at': self.read_at.strftime('%Y-%m-%d %H:%M:%S') if self.read_at else None
 | 
						||
        }
 | 
						||
 | 
						||
    @staticmethod
 | 
						||
    def get_user_notifications(user_id, page=1, per_page=10, unread_only=False):
 | 
						||
        """获取用户通知"""
 | 
						||
        query = Notification.query.filter_by(user_id=user_id)
 | 
						||
 | 
						||
        if unread_only:
 | 
						||
            query = query.filter_by(status=0)
 | 
						||
 | 
						||
        return query.order_by(Notification.created_at.desc()).paginate(
 | 
						||
            page=page, per_page=per_page, error_out=False
 | 
						||
        )
 | 
						||
 | 
						||
    @staticmethod
 | 
						||
    def get_unread_count(user_id):
 | 
						||
        """获取用户未读通知数量"""
 | 
						||
        return Notification.query.filter_by(user_id=user_id, status=0).count()
 | 
						||
 | 
						||
    @staticmethod
 | 
						||
    def mark_as_read(notification_id, user_id=None):
 | 
						||
        """将通知标记为已读"""
 | 
						||
        notification = Notification.query.get(notification_id)
 | 
						||
 | 
						||
        if not notification:
 | 
						||
            return False, "通知不存在"
 | 
						||
 | 
						||
        # 验证用户权限
 | 
						||
        if user_id and notification.user_id != user_id:
 | 
						||
            return False, "无权操作此通知"
 | 
						||
 | 
						||
        notification.status = 1
 | 
						||
        notification.read_at = datetime.now()
 | 
						||
 | 
						||
        try:
 | 
						||
            db.session.commit()
 | 
						||
            return True, "已标记为已读"
 | 
						||
        except Exception as e:
 | 
						||
            db.session.rollback()
 | 
						||
            return False, str(e)
 | 
						||
 | 
						||
    @staticmethod
 | 
						||
    def create_notification(user_id, title, content, notification_type, sender_id=None):
 | 
						||
        """创建新通知"""
 | 
						||
        notification = Notification(
 | 
						||
            user_id=user_id,
 | 
						||
            title=title,
 | 
						||
            content=content,
 | 
						||
            type=notification_type,
 | 
						||
            sender_id=sender_id
 | 
						||
        )
 | 
						||
 | 
						||
        try:
 | 
						||
            db.session.add(notification)
 | 
						||
            db.session.commit()
 | 
						||
            return True, notification
 | 
						||
        except Exception as e:
 | 
						||
            db.session.rollback()
 | 
						||
            return False, str(e)
 | 
						||
 | 
						||
    @staticmethod
 | 
						||
    def create_system_notification(user_ids, title, content, notification_type, sender_id=None):
 | 
						||
        """创建系统通知,发送给多个用户"""
 | 
						||
        success_count = 0
 | 
						||
        fail_count = 0
 | 
						||
 | 
						||
        for user_id in user_ids:
 | 
						||
            success, _ = Notification.create_notification(
 | 
						||
                user_id=user_id,
 | 
						||
                title=title,
 | 
						||
                content=content,
 | 
						||
                notification_type=notification_type,
 | 
						||
                sender_id=sender_id
 | 
						||
            )
 | 
						||
 | 
						||
            if success:
 | 
						||
                success_count += 1
 | 
						||
            else:
 | 
						||
                fail_count += 1
 | 
						||
 | 
						||
        return success_count, fail_count
 |