feat: 调整permission以支持后端路由2

This commit is contained in:
caoqianming 2024-12-16 08:50:48 +08:00
parent 05c20c10bc
commit 800b4fc27c
4 changed files with 74 additions and 0 deletions

View File

@ -222,6 +222,18 @@ class PermissionSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Permission model = Permission
fields = '__all__' 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(serializers.ModelSerializer): class PermissionCreateUpdateSerializer(serializers.ModelSerializer):

View File

@ -43,6 +43,7 @@ from drf_yasg.utils import swagger_auto_schema
from server.settings import get_sysconfig, update_sysconfig, update_dict from server.settings import get_sysconfig, update_sysconfig, update_dict
from apps.utils.constants import DEFAULT_PWD from apps.utils.constants import DEFAULT_PWD
from django.core.cache import cache from django.core.cache import cache
from apps.utils.permission import get_user_route
# logger.info('请求成功! response_code:{}response_headers:{} # logger.info('请求成功! response_code:{}response_headers:{}
# response_body:{}'.format(response_code, response_headers, response_body[:251])) # response_body:{}'.format(response_code, response_headers, response_body[:251]))
@ -493,6 +494,14 @@ class UserViewSet(CustomModelViewSet):
""" """
user = request.user user = request.user
return Response(UserFullInfoSerializer(user).data) 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]) @action(methods=['post'], detail=False, permission_classes=[IsAuthenticated])
def bind_wxmp(self, request, pk=None): def bind_wxmp(self, request, pk=None):

View File

@ -4,6 +4,7 @@ from apps.utils.queryset import get_child_queryset2
from apps.system.models import DataFilter, Dept, Permission, PostRole, UserPost, User from apps.system.models import DataFilter, Dept, Permission, PostRole, UserPost, User
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from typing import List from typing import List
from apps.utils.tools import build_tree_from_list
# 后端代码里有的权限标识 # 后端代码里有的权限标识
ALL_PERMS = [ ALL_PERMS = [
@ -21,6 +22,40 @@ def get_alld_perms(update_cache=False) -> List[str]:
cache.set(key, perms_alld_list, timeout=60*5) cache.set(key, perms_alld_list, timeout=60*5)
return perms_alld_list 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): def get_user_perms_map(user, update_cache=False):
""" """
获取权限字典,可用redis存取(包括功能和数据权限) 获取权限字典,可用redis存取(包括功能和数据权限)

View File

@ -288,3 +288,21 @@ def compare_values(val1, val2, ignore_order=False):
return compare_dicts(val1, val2, ignore_order) return compare_dicts(val1, val2, ignore_order)
else: else:
return val1 == val2 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