174 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
 | 
						|
"""
 | 
						|
@author: 猿小天
 | 
						|
@contact: QQ:1638245306
 | 
						|
@Created on: 2021/6/1 001 22:38
 | 
						|
@Remark: 菜单模块
 | 
						|
"""
 | 
						|
from rest_framework import serializers
 | 
						|
from rest_framework.decorators import action
 | 
						|
 | 
						|
from dvadmin.system.models import Menu, RoleMenuPermission
 | 
						|
from dvadmin.system.views.menu_button import MenuButtonSerializer
 | 
						|
from dvadmin.utils.json_response import SuccessResponse, ErrorResponse
 | 
						|
from dvadmin.utils.serializers import CustomModelSerializer
 | 
						|
from dvadmin.utils.viewset import CustomModelViewSet
 | 
						|
 | 
						|
 | 
						|
class MenuSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    菜单表的简单序列化器
 | 
						|
    """
 | 
						|
    menuPermission = serializers.SerializerMethodField(read_only=True)
 | 
						|
    hasChild = serializers.SerializerMethodField()
 | 
						|
 | 
						|
    def get_menuPermission(self, instance):
 | 
						|
        queryset = instance.menuPermission.order_by('-name').values('id', 'name', 'value')
 | 
						|
        # MenuButtonSerializer(instance.menuPermission.all(), many=True)
 | 
						|
        if queryset:
 | 
						|
            return queryset
 | 
						|
        else:
 | 
						|
            return None
 | 
						|
 | 
						|
    def get_hasChild(self, instance):
 | 
						|
        hasChild = Menu.objects.filter(parent=instance.id)
 | 
						|
        if hasChild:
 | 
						|
            return True
 | 
						|
        return False
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Menu
 | 
						|
        fields = "__all__"
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
 | 
						|
class MenuCreateSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    菜单表的创建序列化器
 | 
						|
    """
 | 
						|
    name = serializers.CharField(required=False)
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        menu_obj = Menu.objects.filter(parent_id=validated_data.get('parent', None)).order_by('-sort').first()
 | 
						|
        last_sort = menu_obj.sort if menu_obj else 0
 | 
						|
        validated_data['sort'] = last_sort + 1
 | 
						|
        return super().create(validated_data)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Menu
 | 
						|
        fields = "__all__"
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
 | 
						|
class WebRouterSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    前端菜单路由的简单序列化器
 | 
						|
    """
 | 
						|
    path = serializers.CharField(source="web_path")
 | 
						|
    title = serializers.CharField(source="name")
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Menu
 | 
						|
        fields = (
 | 
						|
            'id', 'parent', 'icon', 'sort', 'path', 'name', 'title', 'is_link','link_url', 'is_catalog', 'web_path', 'component',
 | 
						|
            'component_name', 'cache', 'visible','is_iframe','is_affix', 'status')
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
 | 
						|
class MenuViewSet(CustomModelViewSet):
 | 
						|
    """
 | 
						|
    菜单管理接口
 | 
						|
    list:查询
 | 
						|
    create:新增
 | 
						|
    update:修改
 | 
						|
    retrieve:单例
 | 
						|
    destroy:删除
 | 
						|
    """
 | 
						|
    queryset = Menu.objects.all()
 | 
						|
    serializer_class = MenuSerializer
 | 
						|
    create_serializer_class = MenuCreateSerializer
 | 
						|
    update_serializer_class = MenuCreateSerializer
 | 
						|
    search_fields = ['name', 'status']
 | 
						|
    filter_fields = ['parent', 'name', 'status', 'is_link', 'visible', 'cache', 'is_catalog']
 | 
						|
 | 
						|
    def list(self, request):
 | 
						|
        """懒加载"""
 | 
						|
        request.query_params._mutable = True
 | 
						|
        params = request.query_params
 | 
						|
        parent = params.get('parent', None)
 | 
						|
        page = params.get('page', None)
 | 
						|
        limit = params.get('limit', None)
 | 
						|
        if page:
 | 
						|
            del params['page']
 | 
						|
        if limit:
 | 
						|
            del params['limit']
 | 
						|
        if params:
 | 
						|
            if parent:
 | 
						|
                queryset = self.queryset.filter(parent=parent)
 | 
						|
            else:
 | 
						|
                queryset = self.queryset.filter()
 | 
						|
        else:
 | 
						|
            queryset = self.queryset.filter(parent__isnull=True)
 | 
						|
        queryset = self.filter_queryset(queryset)
 | 
						|
        serializer = MenuSerializer(queryset, many=True, request=request)
 | 
						|
        data = serializer.data
 | 
						|
        return SuccessResponse(data=data)
 | 
						|
 | 
						|
    @action(methods=['GET'], detail=False, permission_classes=[])
 | 
						|
    def web_router(self, request):
 | 
						|
        """用于前端获取当前角色的路由"""
 | 
						|
        user = request.user
 | 
						|
        if user.is_superuser:
 | 
						|
            queryset = self.queryset.filter(status=1).order_by("sort")
 | 
						|
        else:
 | 
						|
            role_list = user.role.values_list('id', flat=True)
 | 
						|
            menu_list = RoleMenuPermission.objects.filter(role__in=role_list).values_list('menu_id', flat=True)
 | 
						|
            queryset = Menu.objects.filter(id__in=menu_list).order_by("sort")
 | 
						|
        serializer = WebRouterSerializer(queryset, many=True, request=request)
 | 
						|
        data = serializer.data
 | 
						|
        return SuccessResponse(data=data, total=len(data), msg="获取成功")
 | 
						|
 | 
						|
    @action(methods=['GET'], detail=False, permission_classes=[])
 | 
						|
    def get_all_menu(self, request):
 | 
						|
        """用于菜单管理获取所有的菜单"""
 | 
						|
        user = request.user
 | 
						|
        queryset = self.queryset.all()
 | 
						|
        if not user.is_superuser:
 | 
						|
            role_list = user.role.values_list('id', flat=True)
 | 
						|
            menu_list = RoleMenuPermission.objects.filter(role__in=role_list).values_list('menu_id')
 | 
						|
            queryset = Menu.objects.filter(id__in=menu_list)
 | 
						|
        serializer = WebRouterSerializer(queryset, many=True, request=request)
 | 
						|
        data = serializer.data
 | 
						|
        return SuccessResponse(data=data, total=len(data), msg="获取成功")
 | 
						|
 | 
						|
    @action(methods=['POST'], detail=False, permission_classes=[])
 | 
						|
    def move_up(self, request):
 | 
						|
        """菜单上移"""
 | 
						|
        menu_id = request.data.get('menu_id')
 | 
						|
        try:
 | 
						|
            menu = Menu.objects.get(id=menu_id)
 | 
						|
        except Menu.DoesNotExist:
 | 
						|
            return ErrorResponse(msg="菜单不存在")
 | 
						|
        previous_menu = Menu.objects.filter(sort__lt=menu.sort, parent=menu.parent).order_by('-sort').first()
 | 
						|
        if previous_menu:
 | 
						|
            previous_menu.sort, menu.sort = menu.sort, previous_menu.sort
 | 
						|
            previous_menu.save()
 | 
						|
            menu.save()
 | 
						|
        return SuccessResponse(data=[], msg="上移成功")
 | 
						|
 | 
						|
    @action(methods=['POST'], detail=False, permission_classes=[])
 | 
						|
    def move_down(self, request):
 | 
						|
        """菜单下移"""
 | 
						|
        menu_id = request.data['menu_id']
 | 
						|
        try:
 | 
						|
            menu = Menu.objects.get(id=menu_id)
 | 
						|
        except Menu.DoesNotExist:
 | 
						|
            return ErrorResponse(msg="菜单不存在")
 | 
						|
        next_menu = Menu.objects.filter(sort__gt=menu.sort, parent=menu.parent).order_by('sort').first()
 | 
						|
        if next_menu:
 | 
						|
            next_menu.sort, menu.sort = menu.sort, next_menu.sort
 | 
						|
            next_menu.save()
 | 
						|
            menu.save()
 | 
						|
        return SuccessResponse(data=[], msg="下移成功")
 |