diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index c2ba698..6767877 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -175,6 +175,26 @@ class Menu(CoreModel): is_iframe = models.BooleanField(default=False, blank=True, verbose_name="框架外显示", help_text="框架外显示") is_affix = models.BooleanField(default=False, blank=True, verbose_name="是否固定", help_text="是否固定") + @classmethod + def get_all_parent(cls, id: int, all_list=None, nodes=None): + """ + 递归获取给定ID的所有层级 + :param id: 参数ID + :param all_list: 所有列表 + :param nodes: 递归列表 + :return: nodes + """ + if not all_list: + all_list = Menu.objects.values("id", "name", "parent") + if nodes is None: + nodes = [] + for ele in all_list: + if ele.get("id") == id: + parent_id = ele.get("parent") + if parent_id is not None: + cls.get_all_parent(parent_id, all_list, nodes) + nodes.append(ele) + return nodes class Meta: db_table = table_prefix + "system_menu" verbose_name = "菜单表" diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 603861c..6f77931 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -112,10 +112,15 @@ class RoleMenuPermissionSerializer(CustomModelSerializer): """ 菜单和按钮权限 """ + name = serializers.SerializerMethodField() isCheck = serializers.SerializerMethodField() btns = serializers.SerializerMethodField() columns = serializers.SerializerMethodField() + def get_name(self, instance): + parent_list = Menu.get_all_parent(instance['id']) + names = [d["name"] for d in parent_list] + return "/".join(names) def get_isCheck(self, instance): params = self.request.query_params return RoleMenuPermission.objects.filter( @@ -189,9 +194,12 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): RoleMenuButtonPermission.objects.filter(role=pk).delete() for menu in body: if menu.get('isCheck'): - menu_parent = Menu.objects.filter(id=menu.get('id')).values('parent').first() - RoleMenuPermission.objects.create(role_id=pk, menu_id=menu_parent.get('parent')) - RoleMenuPermission.objects.create(role_id=pk, menu_id=menu.get('id')) + menu_parent = Menu.get_all_parent(menu.get('id')) + role_menu_permission_list = [] + for d in menu_parent: + role_menu_permission_list.append(RoleMenuPermission(role_id=pk, menu_id=d["id"])) + RoleMenuPermission.objects.bulk_create(role_menu_permission_list) + # RoleMenuPermission.objects.create(role_id=pk, menu_id=menu.get('id')) for btn in menu.get('btns'): if btn.get('isCheck'): data_range = btn.get('data_range',0) or 0