mirror of
https://github.com/opsre/LiteOps.git
synced 2026-02-23 00:20:46 +08:00
121 lines
3.9 KiB
Python
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)}'
|
|
}) |