From ea335922b2f6f3ee91a6dc46679e1095615f2c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Tue, 15 Aug 2023 23:55:46 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=8F=9C=E5=8D=95=E5=92=8C=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E6=8E=88=E6=9D=83=E5=AE=8C=E6=88=90;=202.=20?= =?UTF-8?q?todo:=20a.=E6=8C=89=E9=92=AE=E6=95=B0=E6=8D=AE=E6=9D=83?= =?UTF-8?q?=E9=99=90;=20b.=E5=AD=97=E6=AE=B5=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/system/views/role.py | 22 +++ .../views/role_menu_button_permission.py | 117 ++++++++++----- backend/requirements.txt | 4 +- web/package.json | 2 +- web/src/i18n/index.ts | 6 +- web/src/main.ts | 2 +- .../role/components/PermissionComNew/api.ts | 28 +++- .../components/PermissionComNew/index.vue | 133 ++++++++++++------ web/src/views/system/role/crud.tsx | 2 +- web/src/views/system/role/index.vue | 15 +- web/vite.config.ts | 2 +- 11 files changed, 237 insertions(+), 96 deletions(-) diff --git a/backend/dvadmin/system/views/role.py b/backend/dvadmin/system/views/role.py index ca655f8..18a3f94 100644 --- a/backend/dvadmin/system/views/role.py +++ b/backend/dvadmin/system/views/role.py @@ -79,6 +79,28 @@ class MenuPermissionSerializer(CustomModelSerializer): fields = ['id', 'parent', 'name', 'menuPermission'] +class MenuButtonPermissionSerializer(CustomModelSerializer): + """ + 菜单和按钮权限 + """ + isCheck = serializers.SerializerMethodField() + + def get_isCheck(self, instance): + is_superuser = self.request.user.is_superuser + if is_superuser: + return True + else: + return MenuButton.objects.filter( + menu__id=instance.id, + role__id__in=self.request.user.role.values_list('id', flat=True), + ).exists() + + class Meta: + model = Menu + fields = '__all__' + + + class RoleViewSet(CustomModelViewSet, FastCrudMixin): """ 角色管理接口 diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 20a7892..f1d5b00 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -28,16 +28,6 @@ class RoleMenuButtonPermissionSerializer(CustomModelSerializer): read_only_fields = ["id"] -class RoleMenuButtonPermissionInitSerializer(CustomModelSerializer): - """ - 初始化菜单按钮-序列化器 - """ - - class Meta: - model = RoleMenuButtonPermission - fields = "__all__" - read_only_fields = ["id"] - class RoleMenuButtonPermissionCreateUpdateSerializer(CustomModelSerializer): """ @@ -52,6 +42,46 @@ class RoleMenuButtonPermissionCreateUpdateSerializer(CustomModelSerializer): read_only_fields = ["id"] +class RoleButtonPermissionSerializer(CustomModelSerializer): + """ + 角色按钮权限 + """ + isCheck = serializers.SerializerMethodField() + + def get_isCheck(self, instance): + params = self.request.query_params + return RoleMenuButtonPermission.objects.filter( + menu_button__id=instance['id'], + role__id=params.get('role'), + ).exists() + + class Meta: + model = MenuButton + fields = ['id','name','value','isCheck'] + +class RoleMenuPermissionSerializer(CustomModelSerializer): + """ + 菜单和按钮权限 + """ + isCheck = serializers.SerializerMethodField() + btns = serializers.SerializerMethodField() + + def get_isCheck(self, instance): + params = self.request.query_params + return RoleMenuPermission.objects.filter( + menu__id=instance['id'], + role__id=params.get('role'), + ).exists() + + def get_btns(self, instance): + btn_list = MenuButton.objects.filter(menu__id=instance['id']).values('id', 'name', 'value') + serializer = RoleButtonPermissionSerializer(btn_list,many=True,request=self.request) + return serializer.data + + class Meta: + model = Menu + fields = ['id','name','isCheck','btns'] + class RoleMenuButtonPermissionViewSet(CustomModelViewSet): """ 菜单按钮接口 @@ -68,40 +98,49 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): extra_filter_class = [] @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) - def role_get_menu(self, request): - """根据当前用户的角色返回角色拥有的菜单""" - data = [] + def get_role_premission(self, request): + """ + 角色授权获取: + :param request: role + :return: menu,btns,columns + """ + params = request.query_params + role = params.get('role',None) + if role is None: + return ErrorResponse(msg="未获取到角色信息") is_superuser = request.user.is_superuser - is_admin = request.user.role.values_list('admin', flat=True) - if is_superuser or True in is_admin: - queryset = Menu.objects.filter(status=1).values('name', 'parent', 'is_catalog', menu_id=F('id')) - for item in queryset: - btn_name = MenuButton.objects.filter(menu=item['menu_id']).values_list('name', flat=True) - data.append({ - 'menu_id': item['menu_id'], - 'name': item['name'], - 'parent': item['parent'], - 'permission': btn_name, - 'is_catalog': item['is_catalog'] - }) + if is_superuser: + queryset = Menu.objects.filter(status=1,is_catalog=False).values('name', 'id').all() else: role_id = request.user.role.values_list('id', flat=True) - queryset = RoleMenuPermission.objects.filter(role__in=role_id).values( - 'menu_id', name=F('menu__name'), parent=F('menu__parent'), is_catalog=F('menu__is_catalog') - ).distinct() - for item in queryset: - btn_name = RoleMenuButtonPermission.objects.filter( - menu_button__menu=item['menu_id'] - ).values_list('menu_button__name', flat=True) - data.append({ - 'menu_id': item['menu_id'], - 'name': item['name'], - 'parent': item['parent'], - 'permission': btn_name, - 'is_catalog': item['is_catalog'] - }) + menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('id',flat=True) + queryset = Menu.objects.filter(status=1, is_catalog=False,id__in=menu_list).values('name', 'id').all() + serializer = RoleMenuPermissionSerializer(queryset,many=True,request=request) + data = serializer.data return DetailResponse(data=data) + @action(methods=['PUT'], detail=True, permission_classes=[IsAuthenticated]) + def set_role_premission(self,request,pk): + """ + 对角色授权: + :param request: + :param pk: role + :return: + """ + body = request.data + RoleMenuPermission.objects.filter(role=pk).delete() + RoleMenuButtonPermission.objects.filter(role=pk).delete() + for menu in body: + if menu.get('isCheck'): + menu_parent = Menu.objects.filter(id=menu.get('id')).values('parent').first() + RoleMenuPermission.objects.create(role_id=pk, menu_id=menu_parent.get('parent')) + RoleMenuPermission.objects.create(role_id=pk, menu_id=menu.get('id')) + for btn in menu.get('btns'): + if btn.get('isCheck'): + RoleMenuButtonPermission.objects.create(role_id=pk, menu_button_id=btn.get('id')) + return DetailResponse(msg="授权成功") + + @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) def role_menu_get_button(self, request): """ diff --git a/backend/requirements.txt b/backend/requirements.txt index f94509b..97d4bfc 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -18,7 +18,7 @@ requests==2.28.2 typing-extensions==4.4.0 smmap==5.0.0 tzlocal==4.1 -channels==3.0.5 +channels==4.0.0 channels-redis==4.0.0 websockets==10.4 user-agents==2.2.0 @@ -28,4 +28,4 @@ psycopg2==2.9.5 uvicorn==0.20.0 gunicorn==20.1.0 gevent==22.10.2 -Pillow==8.3.1 +Pillow==8.3.2 diff --git a/web/package.json b/web/package.json index df9dd8d..6bb8ef9 100644 --- a/web/package.json +++ b/web/package.json @@ -25,7 +25,7 @@ "echarts": "^5.4.1", "echarts-gl": "^2.0.9", "echarts-wordcloud": "^2.1.0", - "element-plus": "^2.2.26", + "element-plus": "^2.3.9", "element-tree-line": "^0.2.1", "font-awesome": "^4.7.0", "js-cookie": "^3.0.1", diff --git a/web/src/i18n/index.ts b/web/src/i18n/index.ts index 2b9072a..cd0f987 100644 --- a/web/src/i18n/index.ts +++ b/web/src/i18n/index.ts @@ -14,9 +14,9 @@ import { useThemeConfig } from '/@/stores/themeConfig'; */ // element plus 自带国际化 -import enLocale from 'element-plus/lib/locale/lang/en'; -import zhcnLocale from 'element-plus/lib/locale/lang/zh-cn'; -import zhtwLocale from 'element-plus/lib/locale/lang/zh-tw'; +import enLocale from 'element-plus/es/locale/lang/en'; +import zhcnLocale from 'element-plus/es/locale/lang/zh-cn'; +import zhtwLocale from 'element-plus/es/locale/lang/zh-tw'; // 定义变量内容 const messages = {}; diff --git a/web/src/main.ts b/web/src/main.ts index 2129246..cb43556 100644 --- a/web/src/main.ts +++ b/web/src/main.ts @@ -2,7 +2,7 @@ import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; import { directive } from '/@/utils/directive'; -import { i18n } from '/@/i18n/index'; +import { i18n } from '/@/i18n'; import other from '/@/utils/other'; import '/@/assets/style/tailwind.css'; // 先引入tailwind css, 以免element-plus冲突 import ElementPlus from 'element-plus'; diff --git a/web/src/views/system/role/components/PermissionComNew/api.ts b/web/src/views/system/role/components/PermissionComNew/api.ts index 9d4c590..12481e5 100644 --- a/web/src/views/system/role/components/PermissionComNew/api.ts +++ b/web/src/views/system/role/components/PermissionComNew/api.ts @@ -1,5 +1,31 @@ import { request } from "/@/utils/service"; +/** + * 获取角色的授权列表 + * @param roleId + * @param query + */ +export function getRolePremission(query:object) { + return request({ + url: '/api/system/role_menu_button_permission/get_role_premission/', + method: 'get', + params:query + }) +} + +/*** + * 设置角色的权限 + * @param roleId + * @param data + */ +export function setRolePremission(roleId:any,data:object) { + return request({ + url: `/api/system/role_menu_button_permission/${roleId}/set_role_premission/`, + method: 'put', + data + }) +} + export function getDataPermissionRange() { return request({ url: '/api/system/role_menu_button_permission/data_scope/', @@ -18,4 +44,4 @@ export function getDataPermissionMenu() { url: '/api/system/role_menu_button_permission/get_role_permissions/', method: 'get' }) -} \ No newline at end of file +} diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index a9b1d87..20def79 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -1,9 +1,13 @@ + diff --git a/web/src/views/system/role/crud.tsx b/web/src/views/system/role/crud.tsx index 388e7ed..0168070 100644 --- a/web/src/views/system/role/crud.tsx +++ b/web/src/views/system/role/crud.tsx @@ -84,7 +84,7 @@ export const createCrudOptions = function ({ }, click: (context: any): void => { const { row } = context; - handleDrawerOpen(); + handleDrawerOpen(row); }, }, }, diff --git a/web/src/views/system/role/index.vue b/web/src/views/system/role/index.vue index d9171e0..b2d4b35 100644 --- a/web/src/views/system/role/index.vue +++ b/web/src/views/system/role/index.vue @@ -8,12 +8,9 @@ - - - - + + + @@ -25,6 +22,8 @@ import permission from './components/PermissionCom/index.vue'; import PermissionComNew from './components/PermissionComNew/index.vue'; let drawerVisible = ref(false); +let roleId = ref(null); +let roleName = ref(null); const rolePermission = ref(); // crud组件的ref @@ -34,7 +33,9 @@ const crudBinding = ref(); // 暴露的方法 const { crudExpose } = useExpose({ crudRef, crudBinding }); -const handleDrawerOpen = () => { +const handleDrawerOpen = (row:any) => { + roleId.value = row.id + roleName.value = row.name drawerVisible.value = true; }; diff --git a/web/vite.config.ts b/web/vite.config.ts index ab2a646..02c966a 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -22,7 +22,7 @@ const viteConfig = defineConfig((mode: ConfigEnv) => { resolve: { alias }, base: mode.command === 'serve' ? './' : env.VITE_PUBLIC_PATH, optimizeDeps: { - include: ['element-plus/lib/locale/lang/zh-cn', 'element-plus/lib/locale/lang/en', 'element-plus/lib/locale/lang/zh-tw'], + include: ['element-plus/es/locale/lang/zh-cn', 'element-plus/es/locale/lang/en', 'element-plus/es/locale/lang/zh-tw'], }, server: { host: '0.0.0.0',