diff --git a/backend/dvadmin/system/fixtures/init_menu.json b/backend/dvadmin/system/fixtures/init_menu.json index 1ad8028..6af8c62 100644 --- a/backend/dvadmin/system/fixtures/init_menu.json +++ b/backend/dvadmin/system/fixtures/init_menu.json @@ -30,31 +30,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "Menu:Search", "api": "/api/system/menu/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "Menu:Retrieve", "api": "/api/system/menu/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "Menu:Create", "api": "/api/system/menu/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "Menu:Update", "api": "/api/system/menu/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "Menu:Delete", "api": "/api/system/menu/{id}/", "method": 3 } @@ -77,25 +77,25 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "MenuButton:Search", "api": "/api/system/menu_button/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "MenuButton:Create", "api": "/api/system/menu_button/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "MenuButton:Update", "api": "/api/system/menu_button/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "MenuButton:Delete", "api": "/api/system/menu_button/{id}/", "method": 3 } @@ -118,31 +118,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "Dept:Search", "api": "/api/system/dept/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "Dept:Retrieve", "api": "/api/system/dept/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "Dept:Create", "api": "/api/system/dept/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "Dept:Update", "api": "/api/system/dept/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "Dept:Delete", "api": "/api/system/dept/{id}/", "method": 3 } @@ -165,37 +165,37 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "Role:Search", "api": "/api/system/role/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "Role:Retrieve", "api": "/api/system/role/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "Role:Create", "api": "/api/system/role/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "Role:Update", "api": "/api/system/role/{id}/", "method": 2 }, { "name": "保存", - "value": "Save", + "value": "Role:Save", "api": "/api/system/role/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "Role:Delete", "api": "/api/system/role/{id}/", "method": 3 } @@ -218,55 +218,55 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "User:Search", "api": "/api/system/user/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "User:Retrieve", "api": "/api/system/user/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "User:Create", "api": "/api/system/user/", "method": 1 }, { "name": "导出", - "value": "Export", + "value": "User:Export", "api": "/api/system/user/export/", "method": 1 }, { "name": "导入", - "value": "Import", + "value": "User:Import", "api": "/api/system/user/import/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "User:Update", "api": "/api/system/user/{id}/", "method": 2 }, { "name": "重设密码", - "value": "ResetPassword", + "value": "User:ResetPassword", "api": "/api/system/user/{id}/reset_password/", "method": 2 }, { "name": "重置密码", - "value": "DefaultPassword", + "value": "User:DefaultPassword", "api": "/api/system/user/{id}/reset_to_default_password/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "User:Delete", "api": "/api/system/user/{id}/", "method": 3 } @@ -289,31 +289,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "MessageCenter:Search", "api": "/api/system/message_center/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "MessageCenter:Retrieve", "api": "/api/system/message_center/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "MessageCenter:Create", "api": "/api/system/message_center/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "MessageCenter:Update", "api": "/api/system/message_center/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "MessageCenter:Delete", "api": "/api/system/menu/{id}/", "method": 3 } @@ -336,31 +336,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "WhiteList:Search", "api": "/api/system/api_white_list/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "WhiteList:Retrieve", "api": "/api/system/api_white_list/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "WhiteList:Create", "api": "/api/system/api_white_list/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "WhiteList:Update", "api": "/api/system/api_white_list/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "WhiteList:Delete", "api": "/api/system/api_white_list/{id}/", "method": 3 } @@ -400,31 +400,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "Config:Search", "api": "/api/system/system_config/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "Config:Retrieve", "api": "/api/system/system_config/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "Config:Create", "api": "/api/system/system_config/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "Config:Update", "api": "/api/system/system_config/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "Config:Delete", "api": "/api/system/system_config/{id}/", "method": 3 } @@ -447,31 +447,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "Dictionary:Search", "api": "/api/system/dictionary/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "Dictionary:Retrieve", "api": "/api/system/dictionary/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "Dictionary:Create", "api": "/api/system/dictionary/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "Dictionary:Update", "api": "/api/system/dictionary/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "Dictionary:Delete", "api": "/api/system/dictionary/{id}/", "method": 3 } @@ -494,31 +494,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "Areas:Search", "api": "/api/system/area/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "Areas:Retrieve", "api": "/api/system/area/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "Areas:Create", "api": "/api/system/area/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "Areas:Update", "api": "/api/system/area/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "Areas:Delete", "api": "/api/system/area/{id}/", "method": 3 } @@ -541,25 +541,25 @@ "menu_button": [ { "name": "详情", - "value": "Retrieve", + "value": "File:Retrieve", "api": "/api/system/file/{id}/", "method": 0 }, { "name": "查询", - "value": "Search", + "value": "File:Search", "api": "/api/system/file/", "method": 0 }, { "name": "编辑", - "value": "Update", + "value": "File:Update", "api": "/api/system/file/{id}/", "method": 1 }, { "name": "删除", - "value": "Delete", + "value": "File:Delete", "api": "/api/system/file/{id}/", "method": 3 } @@ -599,13 +599,13 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "LoginLog:Search", "api": "/api/system/login_log/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "LoginLog:Retrieve", "api": "/api/system/login_log/{id}/", "method": 0 } @@ -628,13 +628,13 @@ "menu_button": [ { "name": "详情", - "value": "Retrieve", + "value": "OperationLog:Retrieve", "api": "/api/system/operation_log/{id}/", "method": 0 }, { "name": "查询", - "value": "Search", + "value": "OperationLog:Search", "api": "/api/system/operation_log/", "method": 0 } diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 62144c6..3f4b766 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -175,7 +175,7 @@ class MenuButton(CoreModel): help_text="关联菜单", ) name = models.CharField(max_length=64, verbose_name="名称", help_text="名称") - value = models.CharField(max_length=64, verbose_name="权限值", help_text="权限值") + value = models.CharField(unique=True,max_length=64, verbose_name="权限值", help_text="权限值") api = models.CharField(max_length=200, verbose_name="接口地址", help_text="接口地址") METHOD_CHOICES = ( (0, "GET"), diff --git a/backend/dvadmin/system/views/menu.py b/backend/dvadmin/system/views/menu.py index 04f3177..f5ec0f4 100644 --- a/backend/dvadmin/system/views/menu.py +++ b/backend/dvadmin/system/views/menu.py @@ -128,25 +128,12 @@ class WebRouterSerializer(CustomModelSerializer): """ path = serializers.CharField(source="web_path") title = serializers.CharField(source="name") - menuPermission = serializers.SerializerMethodField(read_only=True) - def get_menuPermission(self, instance): - # 判断是否是超级管理员 - if self.request.user.is_superuser: - return instance.menuPermission.values_list('value', flat=True) - else: - # 根据当前角色获取权限按钮id集合 - permissionIds = self.request.user.role.values_list('permission', flat=True) - queryset = instance.menuPermission.filter(id__in=permissionIds, menu=instance.id).values_list('value', flat=True) - if queryset: - return queryset - else: - return None class Meta: model = Menu fields = ('id', 'parent', 'icon', 'sort', 'path', 'name', 'title', 'is_link', 'is_catalog', 'web_path', 'component', - 'component_name', 'cache', 'visible', 'menuPermission') + 'component_name', 'cache', 'visible') read_only_fields = ["id"] diff --git a/backend/dvadmin/system/views/menu_button.py b/backend/dvadmin/system/views/menu_button.py index 8c9e668..4cf17a6 100644 --- a/backend/dvadmin/system/views/menu_button.py +++ b/backend/dvadmin/system/views/menu_button.py @@ -6,7 +6,11 @@ @Created on: 2021/6/3 003 0:30 @Remark: 菜单按钮管理 """ -from dvadmin.system.models import MenuButton +from django.db.models import F +from rest_framework.decorators import action + +from dvadmin.system.models import MenuButton, RoleMenuButtonPermission +from dvadmin.utils.json_response import DetailResponse from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet @@ -57,3 +61,19 @@ class MenuButtonViewSet(CustomModelViewSet): create_serializer_class = MenuButtonCreateUpdateSerializer update_serializer_class = MenuButtonCreateUpdateSerializer extra_filter_class = [] + + @action(methods=['get'],detail=False) + def menu_button_all_permission(self,request): + """ + 获取所有的按钮权限 + :param request: + :return: + """ + 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 = MenuButton.objects.values_list('value',flat=True) + else: + role_id = request.user.role.values_list('id', flat=True) + queryset = RoleMenuButtonPermission.objects.filter(role__in=role_id).values_list('menu_button__value',flat=True).distinct() + return DetailResponse(data=queryset) \ No newline at end of file diff --git a/backend/dvadmin/system/views/role.py b/backend/dvadmin/system/views/role.py index 35ea394..c232636 100644 --- a/backend/dvadmin/system/views/role.py +++ b/backend/dvadmin/system/views/role.py @@ -111,107 +111,3 @@ class RoleViewSet(CustomModelViewSet): create_serializer_class = RoleCreateUpdateSerializer update_serializer_class = RoleCreateUpdateSerializer search_fields = ['name', 'key'] - - @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) - def role_get_menu(self, request): - """根据当前用户的角色返回角色拥有的菜单""" - 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).all() - else: - menu_id_list = request.user.role.values_list('menu',flat=True) - queryset = Menu.objects.filter(id__in=menu_id_list) - # queryset = self.filter_queryset(queryset) - serializer = MenuPermissonSerializer(queryset, many=True,request=request) - return DetailResponse(data=serializer.data) - - @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) - def data_scope(self, request): - is_superuser = request.user.is_superuser - role_queryset = Role.objects.filter(users__id=request.user.id).values_list('data_range', flat=True) - if is_superuser: - data = [ - { - "value": 0, - "label": '仅本人数据权限' - }, - { - "value": 1, - "label": '本部门及以下数据权限' - }, - { - "value": 2, - "label": '本部门数据权限' - }, - { - "value": 3, - "label": '全部数据权限' - }, - { - "value": 4, - "label": '自定义数据权限' - } - ] - else: - data = [] - data_range_list = list(set(role_queryset)) - for item in data_range_list: - if item == 0: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }] - elif item == 1: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }, { - "value": 1, - "label": '本部门及以下数据权限' - }, - { - "value": 2, - "label": '本部门数据权限' - }] - elif item == 2: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }, - { - "value": 2, - "label": '本部门数据权限' - }] - elif item == 3: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }, - { - "value": 3, - "label": '全部数据权限' - }, ] - elif item == 4: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }, - { - "value": 4, - "label": '自定义数据权限' - }] - else: - data = [] - return DetailResponse(data=data) - - @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) - def data_scope_dept(self,request): - """根据当前角色获取部门信息""" - is_superuser = request.user.is_superuser - if is_superuser: - queryset = Dept.objects.values('id','name','parent') - else: - dept_list = request.user.role.values_list('dept',flat=True) - queryset = Dept.objects.filter(id__in=dept_list).values('id','name','parent') - return DetailResponse(data=queryset) \ No newline at end of file diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 9d631a5..2bb4c1c 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -71,8 +71,8 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): if is_superuser or True in is_admin: queryset = Menu.objects.filter(status=1).values('id','name','parent','is_catalog') else: - role_id = request.user.role.id - queryset = RoleMenuButtonPermission.objects.filter(role=role_id).values(id=F('menu__id'),name=F('menu__name'),parent=F('menu__parent'),is_catalog=F('menu__is_catalog')) + role_id = request.user.role.values_list('id',flat=True) + queryset = RoleMenuButtonPermission.objects.filter(role__in=role_id).values(id=F('menu__id'),name=F('menu__name'),parent=F('menu__parent'),is_catalog=F('menu__is_catalog')) return DetailResponse(data=queryset) @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) @@ -183,6 +183,11 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): @action(methods=['get'],detail=False) def menu_to_button(self,request): + """ + 根据菜单获取按钮 + :param request: + :return: + """ params = request.query_params if params: menu_id = params.get('menu',None) diff --git a/web/.env.development b/web/.env.development index 1a627b7..bd52088 100644 --- a/web/.env.development +++ b/web/.env.development @@ -2,4 +2,7 @@ ENV = 'development' # 本地环境接口地址 -VITE_API_URL = 'http://127.0.0.1:8000/' \ No newline at end of file +VITE_API_URL = 'http://127.0.0.1:8000/' + +# 是否启用按钮权限 +VITE_PM_ENABLED = true diff --git a/web/.env.production b/web/.env.production index 0336f50..74257c6 100644 --- a/web/.env.production +++ b/web/.env.production @@ -2,4 +2,7 @@ ENV = 'production' # 线上环境接口地址 -VITE_API_URL = 'https://lyt-top.gitee.io/vue-next-admin-preview/' \ No newline at end of file +VITE_API_URL = 'https://lyt-top.gitee.io/vue-next-admin-preview/' + +# 是否启用按钮权限 +VITE_PM_ENABLED = true diff --git a/web/src/main.ts b/web/src/main.ts index 02c2cd6..ced4cd3 100644 --- a/web/src/main.ts +++ b/web/src/main.ts @@ -13,13 +13,12 @@ import piniaPersist from 'pinia-plugin-persist' // @ts-ignore import fastCrud from './settings.ts' import pinia from './stores'; - +import permission from "/@/plugin/permission/index"; const app = createApp(App); pinia.use(piniaPersist) - directive(app); other.elSvg(app); - +app.use(permission) app.use(pinia).use(router).use(ElementPlus, { i18n: i18n.global.t }).use(i18n).use(VueGridLayout).use(fastCrud).mount('#app'); app.config.globalProperties.mittBus = mitt(); diff --git a/web/src/plugin/permission/directive.permission.ts b/web/src/plugin/permission/directive.permission.ts new file mode 100644 index 0000000..032e5aa --- /dev/null +++ b/web/src/plugin/permission/directive.permission.ts @@ -0,0 +1,10 @@ +import permissionUtil from './func.permission' +export default { + mounted (el:any, binding:any) { + const { value } = binding + const hasPermission = permissionUtil.hasPermissions(value) + if (!hasPermission) { + el.parentNode && el.parentNode.removeChild(el) + } + } +} diff --git a/web/src/plugin/permission/func.permission.ts b/web/src/plugin/permission/func.permission.ts new file mode 100644 index 0000000..77911fa --- /dev/null +++ b/web/src/plugin/permission/func.permission.ts @@ -0,0 +1,17 @@ +import XEUtils from 'xe-utils' +import {BtnPermissionStore} from "/@/plugin/permission/store.permission"; + +export default { + hasPermissions (value:string | string[]) { + const BtnPermission = BtnPermissionStore().data + if (import.meta.env.VITE_PM_ENABLED) { + if(value instanceof Array){ + return XEUtils.includeArrays(BtnPermission, value) + }else if(typeof value === 'string'){ + const index = XEUtils.arrayIndexOf(BtnPermission, value) + return index>0?true:false + } + } + return true + } +} diff --git a/web/src/plugin/permission/index.ts b/web/src/plugin/permission/index.ts new file mode 100644 index 0000000..b519bd0 --- /dev/null +++ b/web/src/plugin/permission/index.ts @@ -0,0 +1,10 @@ +import permissionDirective from './directive.permission' +import permissionFunc from './func.permission' +const install = function (app:any) { + app.directive('permission', permissionDirective) + app.provide('$hasPermissions',permissionFunc.hasPermissions) +} + +export default { + install +} diff --git a/web/src/plugin/permission/store.permission.ts b/web/src/plugin/permission/store.permission.ts new file mode 100644 index 0000000..2879628 --- /dev/null +++ b/web/src/plugin/permission/store.permission.ts @@ -0,0 +1,26 @@ +import {defineStore} from "pinia"; +import {DictionaryStates} from "/@/stores/interface"; +import {request} from "/@/utils/service"; + +export const BtnPermissionStore = defineStore('BtnPermission', { + state: (): DictionaryStates => ({ + data: [] + }), + actions: { + async getBtnPermissionStore() { + request({ + url: '/api/system/menu_button/menu_button_all_permission/', + method: 'get', + }).then((ret: { + data: [] + }) => { + // 转换数据格式并保存到pinia + let dataList = ret.data + this.data=dataList + }) + }, + }, + persist: { + enabled: true, + }, +}); diff --git a/web/src/router/backEnd.ts b/web/src/router/backEnd.ts index f4f057c..f225125 100644 --- a/web/src/router/backEnd.ts +++ b/web/src/router/backEnd.ts @@ -11,6 +11,7 @@ import { useRoutesList } from '/@/stores/routesList'; import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes'; import { useMenuApi } from '/@/api/menu/index'; import { handleMenu } from '../utils/menu'; +import {BtnPermissionStore} from "/@/plugin/permission/store.permission"; const menuApi = useMenuApi(); @@ -102,6 +103,8 @@ export async function setAddRoute() { * @returns 返回后端路由菜单数据 */ export function getBackEndControlRoutes() { + //获取所有的按钮权限 + BtnPermissionStore().getBtnPermissionStore(); return menuApi.getSystemMenu(); } diff --git a/web/src/views/system/login/api.ts b/web/src/views/system/login/api.ts index 0edfb65..e0f993d 100644 --- a/web/src/views/system/login/api.ts +++ b/web/src/views/system/login/api.ts @@ -1,5 +1,4 @@ import { request } from "/@/utils/service"; -// import request from "/@/utils/request"; export function getCaptcha() { return request({ @@ -19,4 +18,4 @@ export function getUserInfo() { url: '/api/system/user/user_info/', method: 'get', }); -} \ No newline at end of file +} diff --git a/web/src/views/system/login/component/account.vue b/web/src/views/system/login/component/account.vue index a953220..b89adad 100644 --- a/web/src/views/system/login/component/account.vue +++ b/web/src/views/system/login/component/account.vue @@ -74,6 +74,7 @@ import { NextLoading } from '/@/utils/loading'; import * as loginApi from '/@/views/system/login/api'; import { useUserInfo } from '/@/stores/userInfo'; import { DictionaryStore } from '/@/stores/dictionary'; +import {BtnPermissionStore} from "/@/plugin/permission/store.permission"; import { Md5 } from 'ts-md5'; export default defineComponent({ @@ -139,8 +140,8 @@ export default defineComponent({ const loginSuccess = () => { //登录成功获取用户信息,获取系统字典数据 getUserInfo(); + //获取所有字典 DictionaryStore().getSystemDictionarys(); - // 初始化登录成功时间问候语 let currentTimeInfo = currentTime.value; // 登录成功,跳到转首页 diff --git a/web/src/views/system/menu/components/menuButton/curd.tsx b/web/src/views/system/menu/components/menuButton/curd.tsx index b35657d..d3cd886 100644 --- a/web/src/views/system/menu/components/menuButton/curd.tsx +++ b/web/src/views/system/menu/components/menuButton/curd.tsx @@ -81,11 +81,8 @@ export const createCrudOptions = function ({ }, name: { title: '权限名称', - type: 'dict-select', + type: 'text', search: {show: true}, - dict: dict({ - data: dictionary('system_button') - }), column: { minWidth: 120, sortable: true, @@ -103,7 +100,7 @@ export const createCrudOptions = function ({ }, helper: { render (h) { - return (< el-alert title="可手动输入不在列表中的新值" type="warning" description="比较常用的建议放在字典管理中"/> + return (< el-alert title="手动输入" type="warning" description="页面中按钮的名称或者自定义一个名称"/> ) } } @@ -122,7 +119,7 @@ export const createCrudOptions = function ({ placeholder: '输入权限标识', helper: { render (h) { - return (< el-alert title="用于前端按钮权限的判断展示" type="warning" description="使用方法:vm.hasPermissions(权限值)"/> + return (< el-alert title="唯一值" type="warning" description="用于判断前端按钮权限或接口权限"/> ) } } diff --git a/web/src/views/system/menu/crud.tsx b/web/src/views/system/menu/crud.tsx index f18be74..9ed0073 100644 --- a/web/src/views/system/menu/crud.tsx +++ b/web/src/views/system/menu/crud.tsx @@ -3,12 +3,14 @@ import { dict, PageQuery, AddReq, DelReq, EditReq, CrudExpose, CrudOptions, } fr import { dictionary } from "/@/utils/dictionary"; import iconSelector from '/@/components/iconSelector/index.vue' import {useCompute} from '@fast-crud/fast-crud' +import {inject} from 'vue' const {compute} = useCompute() interface CreateCrudOptionsTypes { crudOptions: CrudOptions; } export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudExpose: CrudExpose,menuButtonRef:any }): CreateCrudOptionsTypes { + const hasPermissions = inject('$hasPermissions') //验证路由地址 const validateWebPath = (rule: string, value: string, callback: Function) => { const isLink = crudExpose.getFormData().is_link @@ -67,6 +69,13 @@ export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudE load:loadContentMethod, treeProps:{children: 'children', hasChildren: 'hasChild'} }, + actionbar: { + buttons: { + add: { + show: hasPermissions('Menu:Create') + } + } + }, rowHandle: { buttons: { custom: { @@ -77,10 +86,11 @@ export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudE content: "按钮配置" }, show:compute(({row}:any)=>{ - if (row.web_path && !row.is_link) { - return true + if (row.web_path && !row.is_link) { + return true && hasPermissions() } return false + }), click:(context:any):void => { const {row} = context