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