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="下移成功")
|