From fc74a3d8d9c1eceb03423969f20f247e37f593b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Fri, 7 Jul 2023 00:19:31 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=9D=83=E9=99=90=E4=B8=8D=E8=83=BD=E4=BC=A0=E5=85=A5=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/application/settings.py | 1 + backend/dvadmin/system/views/menu_button.py | 20 +++++++- web/package.json | 1 + web/src/main.js | 1 + .../directive/permission/util.permission.js | 27 ++++------- web/src/router/routes.js | 8 ++++ .../modules/d2admin/modules/permission.js | 46 +++++++++++++++++++ 7 files changed, 85 insertions(+), 19 deletions(-) create mode 100644 web/src/store/modules/d2admin/modules/permission.js diff --git a/backend/application/settings.py b/backend/application/settings.py index 735a488..224581c 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -412,6 +412,7 @@ PLUGINS_URL_PATTERNS = [] # from dvadmin_ak_sk.settings import * # 秘钥管理管理 # from dvadmin_tenants.settings import * # 租户管理 # from dvadmin_cloud_storage.settings import * # 云存储 +from dvadmin_low_code_crud.settings import * # 低代码操作 # ... # ********** 一键导入插件配置结束 ********** diff --git a/backend/dvadmin/system/views/menu_button.py b/backend/dvadmin/system/views/menu_button.py index 03f4367..16e0feb 100644 --- a/backend/dvadmin/system/views/menu_button.py +++ b/backend/dvadmin/system/views/menu_button.py @@ -6,7 +6,12 @@ @Created on: 2021/6/3 003 0:30 @Remark: 菜单按钮管理 """ -from dvadmin.system.models import MenuButton +from django.db.models import F, CharField, Value, ExpressionWrapper +from django.db.models.functions import Cast, Concat +from rest_framework.decorators import action + +from dvadmin.system.models import MenuButton, Menu +from dvadmin.utils.json_response import DetailResponse from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet @@ -58,3 +63,16 @@ class MenuButtonViewSet(CustomModelViewSet): create_serializer_class = MenuButtonCreateUpdateSerializer update_serializer_class = MenuButtonCreateUpdateSerializer extra_filter_backends = [] + + @action(methods=['get'], detail=False) + def get_btn_permission(self,request): + """ + 获取当前用户的按钮权限 + """ + user = request.user + if not user.is_superuser: + menuIds = user.role.values_list('menu__id', flat=True) + else: + menuIds = Menu.objects.filter(status=1) + queryset = MenuButton.objects.filter(menu__in=menuIds).annotate(permission=Concat('menu__web_path',Value(':'),'value',output_field=CharField())).values_list('permission',flat=True) + return DetailResponse(data=queryset) diff --git a/web/package.json b/web/package.json index 7399dc0..5188dc2 100644 --- a/web/package.json +++ b/web/package.json @@ -29,6 +29,7 @@ "faker": "^4.1.0", "flex.css": "^1.1.7", "fuse.js": "^5.2.3", + "highlight.js": "^11.8.0", "hotkeys-js": "^3.7.3", "js-cookie": "^2.2.1", "js-md5": "^0.7.3", diff --git a/web/src/main.js b/web/src/main.js index fcdba4d..e6cc154 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -54,6 +54,7 @@ new Vue({ // 初始化配置 this.$store.dispatch('d2admin/settings/load') this.$store.dispatch('d2admin/dictionary/load') + this.$store.dispatch('d2admin/permission/load') }, created () { diff --git a/web/src/plugin/permission/directive/permission/util.permission.js b/web/src/plugin/permission/directive/permission/util.permission.js index 82c1960..b5bd9b6 100644 --- a/web/src/plugin/permission/directive/permission/util.permission.js +++ b/web/src/plugin/permission/directive/permission/util.permission.js @@ -6,34 +6,25 @@ * 联系Qq:1638245306 * @文件介绍: 权限控制 */ -import XEUtils from 'xe-utils' +import store from '@/store' import router from '@/router' export default { hasPermissions (value) { if (process.env.VUE_APP_PM_ENABLED) { const path = router.history.current.path// 当前路由 - let need = [] + let needList = [] if (typeof value === 'string') { - need.push(value) + needList.push(path + ':' + value) } else if (value && value instanceof Array && value.length > 0) { - need = need.concat(value) + needList = needList.concat(path + ':' + value) } - if (need.length === 0) { + if (needList.length === 0) { throw new Error('need permissions! Like v-permission="usersphere:user:view" ') } - // 获取所有的菜单路由(包含权限) - let menuTree = sessionStorage.getItem('menuData') - menuTree = JSON.parse(menuTree) - const userPermissionList = XEUtils.toTreeArray(menuTree) - const permissionList = [] - for (const item of userPermissionList) { - if (item.menuPermission) { - for (const per of item.menuPermission) { - permissionList.push(item.path + ':' + per) - } - } - } - return permissionList.includes(path + ':' + value) + const userPermissionList = store.getters['d2admin/permission/permissionList'] + return userPermissionList.some(permission => { + return needList.includes(permission) + }) } return true } diff --git a/web/src/router/routes.js b/web/src/router/routes.js index 7e03791..299f249 100644 --- a/web/src/router/routes.js +++ b/web/src/router/routes.js @@ -20,6 +20,14 @@ const frameIn = [{ }, component: _import('dashboard/workbench/index') }, + { + path: 'page1', + name: 'page1', + meta: { + auth: true + }, + component: _import('demo/page1/index') + }, { path: 'userInfo', name: 'userInfo', diff --git a/web/src/store/modules/d2admin/modules/permission.js b/web/src/store/modules/d2admin/modules/permission.js new file mode 100644 index 0000000..0635335 --- /dev/null +++ b/web/src/store/modules/d2admin/modules/permission.js @@ -0,0 +1,46 @@ +import { request } from '@/api/service' +const urlPrefix = '/api/system/menu_button/get_btn_permission/' +export default { + namespaced: true, + state: { + // 未读消息 + data: [] + }, + getters: { + permissionList (state) { + return state.data + } + }, + actions: { + /** + * @description 获取数据 + * @param {Object} context + * @param {String} param message {String} 信息 + * @param {String} param type {String} 类型 + * @param {Object} payload meta {Object} 附带的信息 + */ + async load ({ + state, + commit + }) { + request({ + url: urlPrefix, + method: 'get', + params: {} + }).then(res => { + const { data } = res + commit('set', data) + }) + } + }, + mutations: { + /** + * 设置权限数据 + * @param state + * @param number + */ + async set (state, data) { + state.data = data + } + } +}