django-vue-admin/backend/dvadmin/system/views/menu.py

129 lines
3.7 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, MenuButton, Button
from dvadmin.utils.json_response import SuccessResponse, DetailResponse
from dvadmin.utils.serializers import CustomModelSerializer
from dvadmin.utils.viewset import CustomModelViewSet
class MenuSerializer(CustomModelSerializer):
"""
菜单表的简单序列化器
"""
parent = serializers.SerializerMethodField(read_only=True)
menuPermission = serializers.SerializerMethodField(read_only=True)
def get_parent(self, instance):
return instance.get_parent().id if instance.get_parent() else None
def get_menuPermission(self, instance):
queryset = (
MenuButton.objects.filter(menu=instance.id)
.order_by("-name")
.values_list("name", flat=True)
)
if queryset:
return queryset
else:
return None
class Meta:
model = Menu
fields = "__all__"
read_only_fields = ["id"]
class MenuCreateSerializer(CustomModelSerializer):
"""
菜单表的创建序列化器
"""
name = serializers.CharField(required=False)
class Meta:
model = Menu
fields = "__all__"
read_only_fields = ["id"]
class WebRouterSerializer(CustomModelSerializer):
"""
前端菜单路由的简单序列化器
"""
path = serializers.CharField(source="web_path")
title = serializers.CharField(source="name")
parent = serializers.SerializerMethodField(read_only=True)
menuPermission = serializers.SerializerMethodField(read_only=True)
def get_parent(self, instance):
return instance.get_parent().id if instance.get_parent() else None
def get_menuPermission(self, instance):
# 判断是否是超级管理员
if self.request.user.is_superuser:
return Button.objects.values_list("value", flat=True)
else:
# 根据当前角色获取权限按钮id集合
permissionIds = self.request.user.role.values_list("permission", flat=True)
queryset = MenuButton.objects.filter(
id__in=permissionIds, menu=instance.id
).values_list("value", flat=True)
if queryset:
return queryset
else:
return None
class Meta:
model = Menu
fields = "__all__"
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 = [
"name",
"status",
"is_link",
"visible",
"cache",
"is_catalog",
]
extra_filter_backends = []
@action(methods=["GET"], detail=True, permission_classes=[])
def web_router(self, request):
"""用于前端获取当前角色的路由"""
user = request.user
queryset = self.queryset.filter(status=1)
if not user.is_superuser:
menuIds = user.role.values_list("menu__id", flat=True)
queryset = Menu.objects.filter(id__in=menuIds, status=1)
serializer = WebRouterSerializer(queryset, many=True, request=request)
data = serializer.data
return SuccessResponse(data=data, total=len(data), msg="获取成功")