添加登录日志

This commit is contained in:
xie7654
2025-07-02 17:17:17 +08:00
parent 6cd05925ff
commit eace8a524d
19 changed files with 443 additions and 23 deletions

View File

@@ -7,6 +7,7 @@ __all__ = [
'DictTypeViewSet',
'PostViewSet',
'UserViewSet',
'LoginLogViewSet',
]
from system.views.dict_data import DictDataViewSet
@@ -16,4 +17,5 @@ from system.views.role import RoleViewSet
from system.views.dept import DeptViewSet
from system.views.post import PostViewSet
from system.views.login_log import LoginLogViewSet
from system.views.user import *

View File

@@ -0,0 +1,30 @@
from system.models import LoginLog
from utils.serializers import CustomModelSerializer
from utils.custom_model_viewSet import CustomModelViewSet
from rest_framework import serializers
class LoginLogSerializer(CustomModelSerializer):
"""
系统访问记录 序列化器
"""
result_text = serializers.SerializerMethodField()
class Meta:
model = LoginLog
fields = '__all__'
read_only_fields = ['id', 'create_time', 'update_time']
def get_result_text(self, obj):
return obj.get_result_display()
class LoginLogViewSet(CustomModelViewSet):
"""
系统访问记录 视图集
"""
queryset = LoginLog.objects.filter(is_deleted=False).order_by('-id')
serializer_class = LoginLogSerializer
filterset_fields = ['id', 'remark', 'creator', 'modifier', 'is_deleted', 'username', 'result', 'user_ip', 'user_agent']
search_fields = ['name'] # 根据实际字段调整
ordering_fields = ['create_time', 'id']
ordering = ['-create_time']

View File

@@ -66,7 +66,6 @@ class MenuSerializer(CustomModelSerializer):
"""更新菜单及关联的元数据"""
self.set_audit_user_fields(validated_data, is_create=False)
meta_data = validated_data.pop('meta', {})
print(self.fields['meta'], "self.fields['meta']")
meta_serializer = self.fields['meta']
meta_serializer.update(instance.meta, meta_data)
return super().update(instance, validated_data)
@@ -74,9 +73,13 @@ class MenuSerializer(CustomModelSerializer):
class MenuUserSerializer(MenuSerializer):
def get_children(self, obj):
children = obj.children.exclude(type='button').order_by('sort')
if children:
return MenuUserSerializer(children, many=True).data
request = self.context.get('request')
children_qs = obj.children.exclude(type='button').order_by('sort')
if request and hasattr(request, 'user') and request.user.is_authenticated and not request.user.is_superuser:
role_ids = request.user.role.values_list('id', flat=True)
children_qs = children_qs.filter(role__id__in=role_ids).distinct()
if children_qs:
return MenuUserSerializer(children_qs, many=True, context=self.context).data
return []
@@ -131,9 +134,11 @@ class MenuViewSet(CustomModelViewSet):
if user.is_superuser:
menus = Menu.objects.filter(pid__isnull=True).exclude(type='button').order_by('sort')
else:
role_ids = user.role.values_list('id', flat=True)
menus = Menu.objects.filter(pid__isnull=True,
role__users=user).exclude(type='button').order_by('sort').distinct()
menus_data = MenuUserSerializer(menus, many=True).data
role__id__in=role_ids
).exclude(type='button').order_by('sort').distinct()
menus_data = MenuUserSerializer(menus, many=True, context={'request': request}).data
return self._build_response(data=menus_data)
def update(self, request, *args, **kwargs):

View File

@@ -7,7 +7,7 @@ from rest_framework.views import APIView
from django.contrib.auth.hashers import make_password
from rest_framework.permissions import IsAuthenticated
from system.models import User, Menu
from system.models import User, Menu, LoginLog
from system.views.menu import MenuSerializer
from utils.serializers import CustomModelSerializer
@@ -54,6 +54,13 @@ class UserLogin(ObtainAuthToken):
user.last_login = timezone.now()
user.save(update_fields=['login_ip', 'last_login'])
user_data = UserSerializer(user).data
# 记录登录日志
LoginLog.objects.create(
username=user.username,
result=LoginLog.LoginResult.SUCCESS,
user_ip=request.META.get('REMOTE_ADDR', ''),
user_agent=request.META.get('HTTP_USER_AGENT', '')
)
# 在序列化后的数据中加入 accessToken
user_data['accessToken'] = token.key
return Response({