diff --git a/apps/system/serializers.py b/apps/system/serializers.py index d95dd3f5..ad2cb6a9 100755 --- a/apps/system/serializers.py +++ b/apps/system/serializers.py @@ -225,6 +225,18 @@ class PermissionSerializer(CustomModelSerializer): class Meta: model = Permission fields = '__all__' + + def validate(self, attrs): + type = attrs["type"] + if type in [Permission.PERM_TYPE_MODULE, Permission.PERM_TYPE_API]: + attrs.pop("component", None) + attrs.pop("is_hidden", None) + attrs.pop("is_fullpage", None) + if type == Permission.PERM_TYPE_API: + attrs.pop("route_name", None) + attrs.pop("icon", None) + attrs.pop("path", None) + return super().validate(attrs) class PermissionCreateUpdateSerializer(CustomModelSerializer): diff --git a/apps/system/views.py b/apps/system/views.py index ac1e6a7d..a0b4b811 100755 --- a/apps/system/views.py +++ b/apps/system/views.py @@ -44,6 +44,7 @@ from drf_yasg.utils import swagger_auto_schema from server.settings import get_sysconfig, update_sysconfig, update_dict from apps.utils.constants import DEFAULT_PWD from django.core.cache import cache +from apps.utils.permission import get_user_route # logger.info('请求成功! response_code:{};response_headers:{}; # response_body:{}'.format(response_code, response_headers, response_body[:251])) @@ -543,6 +544,14 @@ class UserViewSet(CustomModelViewSet): """ user = request.user return Response(UserFullInfoSerializer(user).data) + + @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) + def route(self, request, pk=None): + """登录用户路由 + + 获取登录用户路由 + """ + return Response(get_user_route(request.user)) @action(methods=['post'], detail=False, permission_classes=[IsAuthenticated]) def bind_wxmp(self, request, pk=None): diff --git a/apps/utils/permission.py b/apps/utils/permission.py index d0d19fde..2a85c903 100755 --- a/apps/utils/permission.py +++ b/apps/utils/permission.py @@ -4,6 +4,7 @@ from apps.utils.queryset import get_child_queryset2 from apps.system.models import DataFilter, Dept, Permission, PostRole, UserPost, User from django.db.models.query import QuerySet from typing import List +from apps.utils.tools import build_tree_from_list # 后端代码里有的权限标识 ALL_PERMS = [ @@ -21,6 +22,40 @@ def get_alld_perms(update_cache=False) -> List[str]: cache.set(key, perms_alld_list, timeout=60*5) return perms_alld_list +def get_user_route(user: User) -> List[str]: + """ + 获取用户PC前端路由 + """ + perm_qs = Permission.objects.filter(type__in=[Permission.PERM_TYPE_MODULE, Permission.PERM_TYPE_PAGE]) + user_routes_qs = None + if user.is_superuser: + user_routes_qs = perm_qs + else: + user_routes_qs = perm_qs.filter(role_perms__in=PostRole.objects.filter( + post__in=UserPost.objects.filter(user=user).values_list("post", flat=True)).values_list("role", flat=True)) + user_routes_qs = user_routes_qs.order_by('sort') + user_routes_list = list(user_routes_qs.values("id", "name", "type", "route_name", "icon", "path", "component", "is_hidden", "is_fullpage", "parent")) + for item in user_routes_list: + item["meta"] = {} + item["meta"]["title"] = item["name"] + item.pop("name") + item["meta"]["icon"] = item["icon"] + item.pop("icon") + if item["type"] == Permission.PERM_TYPE_MODULE: + item["meta"]["type"] = "menu" + item.pop("component", None) + item.pop("type") + item["meta"]["hidden"] = item["is_hidden"] + item.pop("is_hidden") + item["meta"]["fullpage"] = item["is_fullpage"] + item.pop("is_fullpage") + item["name"] = item["route_name"] + item.pop("route_name") + return build_tree_from_list(user_routes_list) + + + + def get_user_perms_map(user, update_cache=False): """ 获取权限字典,可用redis存取(包括功能和数据权限) diff --git a/apps/utils/tools.py b/apps/utils/tools.py index 10dce896..c19ae87e 100755 --- a/apps/utils/tools.py +++ b/apps/utils/tools.py @@ -290,3 +290,21 @@ def compare_values(val1, val2, ignore_order=False): return compare_dicts(val1, val2, ignore_order) else: return val1 == val2 + + +def build_tree_from_list(data, parent_field="parent"): + id_map = {item["id"]: item for item in data} + tree = [] + + for item in data: + parent_id = item.get(parent_field, None) + if parent_id is None: + tree.append(item) + else: + parent = id_map.get(parent_id, None) + if parent: + parent.setdefault("children", []).append(item) + else: + tree.append(item) + + return tree \ No newline at end of file