diff --git a/backend/system/models.py b/backend/system/models.py index b249a3f..5000388 100644 --- a/backend/system/models.py +++ b/backend/system/models.py @@ -274,3 +274,7 @@ class User(AbstractUser, CoreModel): verbose_name = '用户数据' verbose_name_plural = verbose_name db_table = 'system_users' + + @property + def get_role_name(self): + return [role.name for role in self.role.all()] \ No newline at end of file diff --git a/backend/system/views/menu.py b/backend/system/views/menu.py index 8240be2..da1a333 100644 --- a/backend/system/views/menu.py +++ b/backend/system/views/menu.py @@ -69,7 +69,7 @@ class MenuMetaViewSet(viewsets.ModelViewSet): class MenuViewSet(CustomModelViewSet): """菜单管理视图集""" - queryset = Menu.objects.filter(pid__isnull=True).order_by('id', 'status') + queryset = Menu.objects.filter(pid__isnull=True).order_by('sort', 'id', 'status') serializer_class = MenuSerializer filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_fields = ['status', 'type', 'pid', 'name'] @@ -91,7 +91,10 @@ class MenuViewSet(CustomModelViewSet): def name_search(self, request): name = request.GET.get('name') pk = request.GET.get('id', None) + pid = request.GET.get('pid', None) queryset = Menu.objects.all() + if pid: + queryset = queryset.filter(pid=pid) if pk: queryset = queryset.exclude(pk=pk) if name: diff --git a/backend/system/views/user.py b/backend/system/views/user.py index 2882300..0a00b7f 100644 --- a/backend/system/views/user.py +++ b/backend/system/views/user.py @@ -6,7 +6,8 @@ from rest_framework.response import Response from rest_framework.views import APIView from django.contrib.auth.hashers import make_password -from system.models import User +from system.models import User, Menu +from system.views.menu import MenuSerializer from utils.serializers import CustomModelSerializer from utils.custom_model_viewSet import CustomModelViewSet @@ -68,10 +69,22 @@ class UserInfo(APIView): user = self.request.user user_data = UserSerializer(user).data if user.is_superuser: - user_data['roles'] = ['admin'] + 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) + 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 return Response({ "code": 0, - "data": user_data, + "data": { + "menus": menus_data, + "permissions": permissions, + "roles": roles, + "user": user_data, + }, "error": None, "message": "ok" }) diff --git a/web/apps/web-antd/src/api/system/menu.ts b/web/apps/web-antd/src/api/system/menu.ts index b81d16a..a391646 100644 --- a/web/apps/web-antd/src/api/system/menu.ts +++ b/web/apps/web-antd/src/api/system/menu.ts @@ -25,7 +25,7 @@ export namespace SystemMenuApi { export interface SystemMenu { [key: string]: any; /** 后端权限标识 */ - authCode: string; + auth_code: string; /** 子级 */ children?: SystemMenu[]; /** 组件 */ @@ -110,9 +110,10 @@ async function isMenuNameExists( async function isMenuSearchExists( name: string, id?: SystemMenuApi.SystemMenu['id'], + pid?: SystemMenuApi.SystemMenu['pid'], ) { return requestClient.get('/system/menu/name-search', { - params: { name, id }, + params: { name, id, pid }, }); } diff --git a/web/apps/web-antd/src/locales/langs/en-US/system.json b/web/apps/web-antd/src/locales/langs/en-US/system.json index c391bba..717354a 100644 --- a/web/apps/web-antd/src/locales/langs/en-US/system.json +++ b/web/apps/web-antd/src/locales/langs/en-US/system.json @@ -29,7 +29,7 @@ "component": "Component", "status": "Status", "sort": "sort", - "authCode": "Permission Code", + "auth_code": "Permission Code", "badge": "Badge", "operation": "Actions", "linkSrc": "Link URL", diff --git a/web/apps/web-antd/src/locales/langs/zh-CN/system.json b/web/apps/web-antd/src/locales/langs/zh-CN/system.json index 9d4d913..139477b 100644 --- a/web/apps/web-antd/src/locales/langs/zh-CN/system.json +++ b/web/apps/web-antd/src/locales/langs/zh-CN/system.json @@ -20,7 +20,7 @@ "activePathMustExist": "该路径未能找到有效的菜单", "advancedSettings": "其它设置", "affixTab": "固定在标签", - "authCode": "权限标识", + "auth_code": "权限标识", "badge": "徽章内容", "badgeVariants": "徽标样式", "badgeType": { diff --git a/web/apps/web-antd/src/views/system/menu/modules/form.vue b/web/apps/web-antd/src/views/system/menu/modules/form.vue index c6c6e30..250a6f3 100644 --- a/web/apps/web-antd/src/views/system/menu/modules/form.vue +++ b/web/apps/web-antd/src/views/system/menu/modules/form.vue @@ -56,7 +56,11 @@ const schema: VbenFormSchema[] = [ .max(30, $t('ui.formRules.maxLength', [$t('system.menu.menuName'), 30])) .refine( async (value: string) => { - return !(await isMenuSearchExists(value, formData.value?.id)); + return !(await isMenuSearchExists( + value, + formData.value?.id, + formData.value?.pid, + )); }, (value) => ({ message: $t('ui.formRules.alreadyExists', [ @@ -252,7 +256,7 @@ const schema: VbenFormSchema[] = [ triggerFields: ['type'], }, fieldName: 'auth_code', - label: $t('system.menu.authCode'), + label: $t('system.menu.auth_code'), }, { component: 'InputNumber',