Files
LiteOps/backend/apps/views/logs.py
2025-06-12 16:48:37 +08:00

121 lines
3.9 KiB
Python

import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from django.db.models import Q
from django.core.paginator import Paginator
from ..models import LoginLog, User
from ..utils.auth import jwt_auth_required
@csrf_exempt
@jwt_auth_required
@require_http_methods(["GET"])
def login_logs_list(request):
"""
获取登录日志列表
"""
try:
# 获取查询参数
page = int(request.GET.get('page', 1))
page_size = int(request.GET.get('page_size', 10))
username = request.GET.get('username', '')
status = request.GET.get('status', '')
ip_address = request.GET.get('ip_address', '')
start_time = request.GET.get('start_time', '')
end_time = request.GET.get('end_time', '')
# 构建查询条件
query = Q()
if username:
users = User.objects.filter(username__icontains=username)
query &= Q(user__in=users)
if status:
query &= Q(status=status)
if ip_address:
query &= Q(ip_address__icontains=ip_address)
if start_time:
query &= Q(login_time__gte=start_time)
if end_time:
query &= Q(login_time__lte=end_time)
# 获取登录日志
logs = LoginLog.objects.filter(query).select_related('user').order_by('-login_time')
# 分页
paginator = Paginator(logs, page_size)
current_page = paginator.page(page)
# 格式化返回数据
log_list = []
for log in current_page.object_list:
log_data = {
'log_id': log.log_id,
'username': log.user.username if log.user else None,
'user_id': log.user.user_id if log.user else None,
'ip_address': log.ip_address,
'user_agent': log.user_agent,
'status': log.status,
'fail_reason': log.fail_reason,
'login_time': log.login_time.strftime('%Y-%m-%d %H:%M:%S') if log.login_time else None
}
log_list.append(log_data)
return JsonResponse({
'code': 200,
'message': '获取登录日志成功',
'data': {
'total': paginator.count,
'page': page,
'page_size': page_size,
'logs': log_list
}
})
except Exception as e:
return JsonResponse({
'code': 500,
'message': f'服务器错误: {str(e)}'
})
@csrf_exempt
@jwt_auth_required
@require_http_methods(["GET"])
def login_log_detail(request, log_id):
"""
获取登录日志详情
"""
try:
try:
log = LoginLog.objects.select_related('user').get(log_id=log_id)
except LoginLog.DoesNotExist:
return JsonResponse({
'code': 404,
'message': '登录日志不存在'
})
log_data = {
'log_id': log.log_id,
'username': log.user.username if log.user else None,
'user_id': log.user.user_id if log.user else None,
'user_name': log.user.name if log.user else None,
'ip_address': log.ip_address,
'user_agent': log.user_agent,
'status': log.status,
'fail_reason': log.fail_reason,
'login_time': log.login_time.strftime('%Y-%m-%d %H:%M:%S') if log.login_time else None
}
return JsonResponse({
'code': 200,
'message': '获取登录日志详情成功',
'data': log_data
})
except Exception as e:
return JsonResponse({
'code': 500,
'message': f'服务器错误: {str(e)}'
})