diff --git a/backend/system/urls.py b/backend/system/urls.py index 7243609..a2ae9f8 100644 --- a/backend/system/urls.py +++ b/backend/system/urls.py @@ -18,4 +18,5 @@ urlpatterns = [ path('login/', views.user.UserLogin.as_view()), path('info/', views.user.UserInfo.as_view()), path('codes/', views.user.Codes.as_view()), + path('logout/', views.user.Logout.as_view()), ] \ No newline at end of file diff --git a/backend/system/views/menu.py b/backend/system/views/menu.py index da1a333..8cea4aa 100644 --- a/backend/system/views/menu.py +++ b/backend/system/views/menu.py @@ -15,6 +15,7 @@ class MenuMetaSerializer(serializers.ModelSerializer): model = MenuMeta fields = '__all__' + class MenuSerializer(CustomModelSerializer): """菜单序列化器""" parent = serializers.CharField(source='pid.name', read_only=True) @@ -60,6 +61,13 @@ class MenuSerializer(CustomModelSerializer): return super().update(instance, validated_data) +class MenuUserSerializer(MenuSerializer): + def get_children(self, obj): + children = obj.children.exclude(type='button') + if children: + return MenuUserSerializer(children, many=True).data + return [] + class MenuMetaViewSet(viewsets.ModelViewSet): """菜单元数据视图集""" @@ -106,6 +114,16 @@ class MenuViewSet(CustomModelViewSet): def path_exists(self, request): return self._build_response() + @action(detail=False, methods=['get'], url_path='user_menu') + def user_menu(self, request): + user = self.request.user + if user.is_superuser: + menus = Menu.objects.filter(pid__isnull=True).exclude(type='button').order_by('sort') + else: + menus = Menu.objects.filter(pid__isnull=True, + role__users=user).exclude(type='button').order_by('sort').distinct() + menus_data = MenuUserSerializer(menus, many=True).data + return self._build_response(data=menus_data) def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) diff --git a/backend/system/views/user.py b/backend/system/views/user.py index 0a00b7f..f393350 100644 --- a/backend/system/views/user.py +++ b/backend/system/views/user.py @@ -5,6 +5,7 @@ from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.response import Response from rest_framework.views import APIView from django.contrib.auth.hashers import make_password +from rest_framework.permissions import IsAuthenticated from system.models import User, Menu from system.views.menu import MenuSerializer @@ -70,21 +71,17 @@ class UserInfo(APIView): user_data = UserSerializer(user).data if user.is_superuser: roles = ['admin'] - menus = Menu.objects.filter(pid__isnull=True).order_by('sort') - permissions = Menu.objects.filter(type='button').order_by('sort').values_list('auth_code', flat=True) + # menus = Menu.objects.filter(pid__isnull=True).order_by('sort') + # permissions = Menu.objects.filter(type='button').order_by('sort').values_list('auth_code', flat=True) else: roles = user.get_role_name - menus = Menu.objects.filter(pid__isnull=True, role__users=user).order_by('sort').distinct() - permissions = Menu.objects.filter(type='button', role__users=user).order_by('sort').distinct().values_list('auth_code', flat=True) - menus_data = MenuSerializer(menus, many=True).data + # menus = Menu.objects.filter(pid__isnull=True, role__users=user).order_by('sort').distinct() + # permissions = Menu.objects.filter(type='button', role__users=user).order_by('sort').distinct().values_list('auth_code', flat=True) + # menus_data = MenuSerializer(menus, many=True).data + user_data['roles'] = roles return Response({ "code": 0, - "data": { - "menus": menus_data, - "permissions": permissions, - "roles": roles, - "user": user_data, - }, + "data": user_data, "error": None, "message": "ok" }) @@ -120,3 +117,18 @@ class UserViewSet(CustomModelViewSet): ordering_fields = ['create_time', 'id'] ordering = ['-create_time'] + +class Logout(APIView): + permission_classes = [IsAuthenticated] + + def post(self, request, *args, **kwargs): + # user = request.user + # 删除用户的Token + # Token.objects.filter(user=user).delete() + return Response({ + "code": 0, + "data": None, + "error": None, + "message": "登出成功" + }) + diff --git a/web/apps/web-antd/index.html b/web/apps/web-antd/index.html index 480eb84..459c5d2 100644 --- a/web/apps/web-antd/index.html +++ b/web/apps/web-antd/index.html @@ -16,16 +16,16 @@
diff --git a/web/apps/web-antd/src/api/core/menu.ts b/web/apps/web-antd/src/api/core/menu.ts index 9ef60b1..30a7e4a 100644 --- a/web/apps/web-antd/src/api/core/menu.ts +++ b/web/apps/web-antd/src/api/core/menu.ts @@ -6,5 +6,7 @@ import { requestClient } from '#/api/request'; * 获取用户所有菜单 */ export async function getAllMenusApi() { - return requestClient.get