添加登录日志
This commit is contained in:
@@ -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 *
|
||||
30
backend/system/views/login_log.py
Normal file
30
backend/system/views/login_log.py
Normal 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']
|
||||
@@ -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):
|
||||
|
||||
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user