From 61fb71133d0f9c4d7f2e4f49dd760d23ac8a86d6 Mon Sep 17 00:00:00 2001 From: xie7654 <765462425@qq.com> Date: Tue, 1 Jul 2025 20:43:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=80=E5=87=BA=E7=99=BB?= =?UTF-8?q?=E5=BD=95=EF=BC=8C=E8=8F=9C=E5=8D=95=E6=94=B9=E4=B8=BA=E5=90=8E?= =?UTF-8?q?=E7=AB=AFapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/system/urls.py | 1 + backend/system/views/menu.py | 18 +++++++++++++ backend/system/views/user.py | 34 +++++++++++++++++-------- web/apps/web-antd/index.html | 20 +++++++-------- web/apps/web-antd/src/api/core/menu.ts | 4 ++- web/apps/web-antd/src/layouts/basic.vue | 2 +- web/apps/web-antd/src/preferences.ts | 1 + web/packages/types/src/user.ts | 1 + 8 files changed, 58 insertions(+), 23 deletions(-) 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('/menu/all'); + return requestClient.get( + '/system/menu/user_menu', + ); } diff --git a/web/apps/web-antd/src/layouts/basic.vue b/web/apps/web-antd/src/layouts/basic.vue index baa47d2..eb33693 100644 --- a/web/apps/web-antd/src/layouts/basic.vue +++ b/web/apps/web-antd/src/layouts/basic.vue @@ -128,7 +128,7 @@ watch(