68 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from datetime import datetime
 | 
						||
from app.models.user import db, User  # 从user模块导入db,而不是从utils导入
 | 
						||
 | 
						||
 | 
						||
class Log(db.Model):
 | 
						||
    __tablename__ = 'logs'
 | 
						||
 | 
						||
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
 | 
						||
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
 | 
						||
    action = db.Column(db.String(64), nullable=False)
 | 
						||
    target_type = db.Column(db.String(32), nullable=True)
 | 
						||
    target_id = db.Column(db.Integer, nullable=True)
 | 
						||
    ip_address = db.Column(db.String(45), nullable=True)
 | 
						||
    description = db.Column(db.String(255), nullable=True)
 | 
						||
    created_at = db.Column(db.DateTime, nullable=False, default=datetime.now)
 | 
						||
 | 
						||
    # 关联用户
 | 
						||
    user = db.relationship('User', backref=db.backref('logs', lazy=True))
 | 
						||
 | 
						||
    def __init__(self, action, user_id=None, target_type=None, target_id=None,
 | 
						||
                 ip_address=None, description=None):
 | 
						||
        self.user_id = user_id
 | 
						||
        self.action = action
 | 
						||
        self.target_type = target_type
 | 
						||
        self.target_id = target_id
 | 
						||
        self.ip_address = ip_address
 | 
						||
        self.description = description
 | 
						||
        self.created_at = datetime.now()
 | 
						||
 | 
						||
    @staticmethod
 | 
						||
    def add_log(action, user_id=None, target_type=None, target_id=None,
 | 
						||
                ip_address=None, description=None):
 | 
						||
        """添加一条日志记录"""
 | 
						||
        try:
 | 
						||
            log = Log(
 | 
						||
                action=action,
 | 
						||
                user_id=user_id,
 | 
						||
                target_type=target_type,
 | 
						||
                target_id=target_id,
 | 
						||
                ip_address=ip_address,
 | 
						||
                description=description
 | 
						||
            )
 | 
						||
            db.session.add(log)
 | 
						||
            db.session.commit()
 | 
						||
            return True, "日志记录成功"
 | 
						||
        except Exception as e:
 | 
						||
            db.session.rollback()
 | 
						||
            return False, f"日志记录失败: {str(e)}"
 | 
						||
 | 
						||
    @staticmethod
 | 
						||
    def get_logs(page=1, per_page=20, user_id=None, action=None,
 | 
						||
                 target_type=None, start_date=None, end_date=None):
 | 
						||
        """查询日志记录"""
 | 
						||
        query = Log.query.order_by(Log.created_at.desc())
 | 
						||
 | 
						||
        if user_id:
 | 
						||
            query = query.filter(Log.user_id == user_id)
 | 
						||
        if action:
 | 
						||
            query = query.filter(Log.action == action)
 | 
						||
        if target_type:
 | 
						||
            query = query.filter(Log.target_type == target_type)
 | 
						||
        if start_date:
 | 
						||
            query = query.filter(Log.created_at >= start_date)
 | 
						||
        if end_date:
 | 
						||
            query = query.filter(Log.created_at <= end_date)
 | 
						||
 | 
						||
        return query.paginate(page=page, per_page=per_page)
 |