Merge remote-tracking branch 'origin/master'

This commit is contained in:
H0nGzA1
2023-02-11 16:00:43 +08:00
18 changed files with 186 additions and 200 deletions

View File

@@ -30,31 +30,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "Menu:Search",
"api": "/api/system/menu/", "api": "/api/system/menu/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "Menu:Retrieve",
"api": "/api/system/menu/{id}/", "api": "/api/system/menu/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "Menu:Create",
"api": "/api/system/menu/", "api": "/api/system/menu/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "Menu:Update",
"api": "/api/system/menu/{id}/", "api": "/api/system/menu/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "Menu:Delete",
"api": "/api/system/menu/{id}/", "api": "/api/system/menu/{id}/",
"method": 3 "method": 3
} }
@@ -77,25 +77,25 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "MenuButton:Search",
"api": "/api/system/menu_button/", "api": "/api/system/menu_button/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "MenuButton:Create",
"api": "/api/system/menu_button/", "api": "/api/system/menu_button/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "MenuButton:Update",
"api": "/api/system/menu_button/{id}/", "api": "/api/system/menu_button/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "MenuButton:Delete",
"api": "/api/system/menu_button/{id}/", "api": "/api/system/menu_button/{id}/",
"method": 3 "method": 3
} }
@@ -118,31 +118,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "Dept:Search",
"api": "/api/system/dept/", "api": "/api/system/dept/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "Dept:Retrieve",
"api": "/api/system/dept/{id}/", "api": "/api/system/dept/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "Dept:Create",
"api": "/api/system/dept/", "api": "/api/system/dept/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "Dept:Update",
"api": "/api/system/dept/{id}/", "api": "/api/system/dept/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "Dept:Delete",
"api": "/api/system/dept/{id}/", "api": "/api/system/dept/{id}/",
"method": 3 "method": 3
} }
@@ -165,37 +165,37 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "Role:Search",
"api": "/api/system/role/", "api": "/api/system/role/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "Role:Retrieve",
"api": "/api/system/role/{id}/", "api": "/api/system/role/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "Role:Create",
"api": "/api/system/role/", "api": "/api/system/role/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "Role:Update",
"api": "/api/system/role/{id}/", "api": "/api/system/role/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "保存", "name": "保存",
"value": "Save", "value": "Role:Save",
"api": "/api/system/role/{id}/", "api": "/api/system/role/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "Role:Delete",
"api": "/api/system/role/{id}/", "api": "/api/system/role/{id}/",
"method": 3 "method": 3
} }
@@ -218,55 +218,55 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "User:Search",
"api": "/api/system/user/", "api": "/api/system/user/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "User:Retrieve",
"api": "/api/system/user/{id}/", "api": "/api/system/user/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "User:Create",
"api": "/api/system/user/", "api": "/api/system/user/",
"method": 1 "method": 1
}, },
{ {
"name": "导出", "name": "导出",
"value": "Export", "value": "User:Export",
"api": "/api/system/user/export/", "api": "/api/system/user/export/",
"method": 1 "method": 1
}, },
{ {
"name": "导入", "name": "导入",
"value": "Import", "value": "User:Import",
"api": "/api/system/user/import/", "api": "/api/system/user/import/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "User:Update",
"api": "/api/system/user/{id}/", "api": "/api/system/user/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "重设密码", "name": "重设密码",
"value": "ResetPassword", "value": "User:ResetPassword",
"api": "/api/system/user/{id}/reset_password/", "api": "/api/system/user/{id}/reset_password/",
"method": 2 "method": 2
}, },
{ {
"name": "重置密码", "name": "重置密码",
"value": "DefaultPassword", "value": "User:DefaultPassword",
"api": "/api/system/user/{id}/reset_to_default_password/", "api": "/api/system/user/{id}/reset_to_default_password/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "User:Delete",
"api": "/api/system/user/{id}/", "api": "/api/system/user/{id}/",
"method": 3 "method": 3
} }
@@ -289,31 +289,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "MessageCenter:Search",
"api": "/api/system/message_center/", "api": "/api/system/message_center/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "MessageCenter:Retrieve",
"api": "/api/system/message_center/{id}/", "api": "/api/system/message_center/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "MessageCenter:Create",
"api": "/api/system/message_center/", "api": "/api/system/message_center/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "MessageCenter:Update",
"api": "/api/system/message_center/{id}/", "api": "/api/system/message_center/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "MessageCenter:Delete",
"api": "/api/system/menu/{id}/", "api": "/api/system/menu/{id}/",
"method": 3 "method": 3
} }
@@ -336,31 +336,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "WhiteList:Search",
"api": "/api/system/api_white_list/", "api": "/api/system/api_white_list/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "WhiteList:Retrieve",
"api": "/api/system/api_white_list/{id}/", "api": "/api/system/api_white_list/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "WhiteList:Create",
"api": "/api/system/api_white_list/", "api": "/api/system/api_white_list/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "WhiteList:Update",
"api": "/api/system/api_white_list/{id}/", "api": "/api/system/api_white_list/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "WhiteList:Delete",
"api": "/api/system/api_white_list/{id}/", "api": "/api/system/api_white_list/{id}/",
"method": 3 "method": 3
} }
@@ -400,31 +400,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "Config:Search",
"api": "/api/system/system_config/", "api": "/api/system/system_config/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "Config:Retrieve",
"api": "/api/system/system_config/{id}/", "api": "/api/system/system_config/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "Config:Create",
"api": "/api/system/system_config/", "api": "/api/system/system_config/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "Config:Update",
"api": "/api/system/system_config/{id}/", "api": "/api/system/system_config/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "Config:Delete",
"api": "/api/system/system_config/{id}/", "api": "/api/system/system_config/{id}/",
"method": 3 "method": 3
} }
@@ -447,31 +447,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "Dictionary:Search",
"api": "/api/system/dictionary/", "api": "/api/system/dictionary/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "Dictionary:Retrieve",
"api": "/api/system/dictionary/{id}/", "api": "/api/system/dictionary/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "Dictionary:Create",
"api": "/api/system/dictionary/", "api": "/api/system/dictionary/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "Dictionary:Update",
"api": "/api/system/dictionary/{id}/", "api": "/api/system/dictionary/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "Dictionary:Delete",
"api": "/api/system/dictionary/{id}/", "api": "/api/system/dictionary/{id}/",
"method": 3 "method": 3
} }
@@ -494,31 +494,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "Areas:Search",
"api": "/api/system/area/", "api": "/api/system/area/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "Areas:Retrieve",
"api": "/api/system/area/{id}/", "api": "/api/system/area/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "Areas:Create",
"api": "/api/system/area/", "api": "/api/system/area/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "Areas:Update",
"api": "/api/system/area/{id}/", "api": "/api/system/area/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "Areas:Delete",
"api": "/api/system/area/{id}/", "api": "/api/system/area/{id}/",
"method": 3 "method": 3
} }
@@ -541,25 +541,25 @@
"menu_button": [ "menu_button": [
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "File:Retrieve",
"api": "/api/system/file/{id}/", "api": "/api/system/file/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "File:Search",
"api": "/api/system/file/", "api": "/api/system/file/",
"method": 0 "method": 0
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "File:Update",
"api": "/api/system/file/{id}/", "api": "/api/system/file/{id}/",
"method": 1 "method": 1
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "File:Delete",
"api": "/api/system/file/{id}/", "api": "/api/system/file/{id}/",
"method": 3 "method": 3
} }
@@ -599,13 +599,13 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "LoginLog:Search",
"api": "/api/system/login_log/", "api": "/api/system/login_log/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "LoginLog:Retrieve",
"api": "/api/system/login_log/{id}/", "api": "/api/system/login_log/{id}/",
"method": 0 "method": 0
} }
@@ -628,13 +628,13 @@
"menu_button": [ "menu_button": [
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "OperationLog:Retrieve",
"api": "/api/system/operation_log/{id}/", "api": "/api/system/operation_log/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "OperationLog:Search",
"api": "/api/system/operation_log/", "api": "/api/system/operation_log/",
"method": 0 "method": 0
} }

View File

@@ -175,7 +175,7 @@ class MenuButton(CoreModel):
help_text="关联菜单", help_text="关联菜单",
) )
name = models.CharField(max_length=64, verbose_name="名称", 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="接口地址") api = models.CharField(max_length=200, verbose_name="接口地址", help_text="接口地址")
METHOD_CHOICES = ( METHOD_CHOICES = (
(0, "GET"), (0, "GET"),

View File

@@ -128,25 +128,12 @@ class WebRouterSerializer(CustomModelSerializer):
""" """
path = serializers.CharField(source="web_path") path = serializers.CharField(source="web_path")
title = serializers.CharField(source="name") 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: class Meta:
model = Menu model = Menu
fields = ('id', 'parent', 'icon', 'sort', 'path', 'name', 'title', 'is_link', 'is_catalog', 'web_path', 'component', 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"] read_only_fields = ["id"]

View File

@@ -6,7 +6,11 @@
@Created on: 2021/6/3 003 0:30 @Created on: 2021/6/3 003 0:30
@Remark: 菜单按钮管理 @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.serializers import CustomModelSerializer
from dvadmin.utils.viewset import CustomModelViewSet from dvadmin.utils.viewset import CustomModelViewSet
@@ -57,3 +61,19 @@ class MenuButtonViewSet(CustomModelViewSet):
create_serializer_class = MenuButtonCreateUpdateSerializer create_serializer_class = MenuButtonCreateUpdateSerializer
update_serializer_class = MenuButtonCreateUpdateSerializer update_serializer_class = MenuButtonCreateUpdateSerializer
extra_filter_class = [] 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)

View File

@@ -111,107 +111,3 @@ class RoleViewSet(CustomModelViewSet):
create_serializer_class = RoleCreateUpdateSerializer create_serializer_class = RoleCreateUpdateSerializer
update_serializer_class = RoleCreateUpdateSerializer update_serializer_class = RoleCreateUpdateSerializer
search_fields = ['name', 'key'] 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)

View File

@@ -71,8 +71,8 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet):
if is_superuser or True in is_admin: if is_superuser or True in is_admin:
queryset = Menu.objects.filter(status=1).values('id','name','parent','is_catalog') queryset = Menu.objects.filter(status=1).values('id','name','parent','is_catalog')
else: else:
role_id = request.user.role.id role_id = request.user.role.values_list('id',flat=True)
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')) 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) return DetailResponse(data=queryset)
@action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
@@ -183,6 +183,11 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet):
@action(methods=['get'],detail=False) @action(methods=['get'],detail=False)
def menu_to_button(self,request): def menu_to_button(self,request):
"""
根据菜单获取按钮
:param request:
:return:
"""
params = request.query_params params = request.query_params
if params: if params:
menu_id = params.get('menu',None) menu_id = params.get('menu',None)

View File

@@ -3,3 +3,6 @@ ENV = 'development'
# 本地环境接口地址 # 本地环境接口地址
VITE_API_URL = 'http://127.0.0.1:8000/' VITE_API_URL = 'http://127.0.0.1:8000/'
# 是否启用按钮权限
VITE_PM_ENABLED = true

View File

@@ -3,3 +3,6 @@ ENV = 'production'
# 线上环境接口地址 # 线上环境接口地址
VITE_API_URL = 'https://lyt-top.gitee.io/vue-next-admin-preview/' VITE_API_URL = 'https://lyt-top.gitee.io/vue-next-admin-preview/'
# 是否启用按钮权限
VITE_PM_ENABLED = true

View File

@@ -13,13 +13,12 @@ import piniaPersist from 'pinia-plugin-persist'
// @ts-ignore // @ts-ignore
import fastCrud from './settings.ts' import fastCrud from './settings.ts'
import pinia from './stores'; import pinia from './stores';
import permission from "/@/plugin/permission/index";
const app = createApp(App); const app = createApp(App);
pinia.use(piniaPersist) pinia.use(piniaPersist)
directive(app); directive(app);
other.elSvg(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.use(pinia).use(router).use(ElementPlus, { i18n: i18n.global.t }).use(i18n).use(VueGridLayout).use(fastCrud).mount('#app');
app.config.globalProperties.mittBus = mitt(); app.config.globalProperties.mittBus = mitt();

View File

@@ -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)
}
}
}

View File

@@ -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
}
}

View File

@@ -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
}

View File

@@ -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,
},
});

View File

@@ -11,6 +11,7 @@ import { useRoutesList } from '/@/stores/routesList';
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes'; import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import { useMenuApi } from '/@/api/menu/index'; import { useMenuApi } from '/@/api/menu/index';
import { handleMenu } from '../utils/menu'; import { handleMenu } from '../utils/menu';
import {BtnPermissionStore} from "/@/plugin/permission/store.permission";
const menuApi = useMenuApi(); const menuApi = useMenuApi();
@@ -102,6 +103,8 @@ export async function setAddRoute() {
* @returns 返回后端路由菜单数据 * @returns 返回后端路由菜单数据
*/ */
export function getBackEndControlRoutes() { export function getBackEndControlRoutes() {
//获取所有的按钮权限
BtnPermissionStore().getBtnPermissionStore();
return menuApi.getSystemMenu(); return menuApi.getSystemMenu();
} }

View File

@@ -1,5 +1,4 @@
import { request } from "/@/utils/service"; import { request } from "/@/utils/service";
// import request from "/@/utils/request";
export function getCaptcha() { export function getCaptcha() {
return request({ return request({

View File

@@ -74,6 +74,7 @@ import { NextLoading } from '/@/utils/loading';
import * as loginApi from '/@/views/system/login/api'; import * as loginApi from '/@/views/system/login/api';
import { useUserInfo } from '/@/stores/userInfo'; import { useUserInfo } from '/@/stores/userInfo';
import { DictionaryStore } from '/@/stores/dictionary'; import { DictionaryStore } from '/@/stores/dictionary';
import {BtnPermissionStore} from "/@/plugin/permission/store.permission";
import { Md5 } from 'ts-md5'; import { Md5 } from 'ts-md5';
export default defineComponent({ export default defineComponent({
@@ -139,8 +140,8 @@ export default defineComponent({
const loginSuccess = () => { const loginSuccess = () => {
//登录成功获取用户信息,获取系统字典数据 //登录成功获取用户信息,获取系统字典数据
getUserInfo(); getUserInfo();
//获取所有字典
DictionaryStore().getSystemDictionarys(); DictionaryStore().getSystemDictionarys();
// 初始化登录成功时间问候语 // 初始化登录成功时间问候语
let currentTimeInfo = currentTime.value; let currentTimeInfo = currentTime.value;
// 登录成功,跳到转首页 // 登录成功,跳到转首页

View File

@@ -81,11 +81,8 @@ export const createCrudOptions = function ({
}, },
name: { name: {
title: '权限名称', title: '权限名称',
type: 'dict-select', type: 'text',
search: {show: true}, search: {show: true},
dict: dict({
data: dictionary('system_button')
}),
column: { column: {
minWidth: 120, minWidth: 120,
sortable: true, sortable: true,
@@ -103,7 +100,7 @@ export const createCrudOptions = function ({
}, },
helper: { helper: {
render (h) { 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: '输入权限标识', placeholder: '输入权限标识',
helper: { helper: {
render (h) { render (h) {
return (< el-alert title="用于前端按钮权限的判断展示" type="warning" description="使用方法vm.hasPermissions(权限值)"/> return (< el-alert title="唯一值" type="warning" description="用于判断前端按钮权限或接口权限"/>
) )
} }
} }

View File

@@ -3,12 +3,14 @@ import { dict, PageQuery, AddReq, DelReq, EditReq, CrudExpose, CrudOptions, } fr
import { dictionary } from "/@/utils/dictionary"; import { dictionary } from "/@/utils/dictionary";
import iconSelector from '/@/components/iconSelector/index.vue' import iconSelector from '/@/components/iconSelector/index.vue'
import {useCompute} from '@fast-crud/fast-crud' import {useCompute} from '@fast-crud/fast-crud'
import {inject} from 'vue'
const {compute} = useCompute() const {compute} = useCompute()
interface CreateCrudOptionsTypes { interface CreateCrudOptionsTypes {
crudOptions: CrudOptions; crudOptions: CrudOptions;
} }
export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudExpose: CrudExpose,menuButtonRef:any }): CreateCrudOptionsTypes { export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudExpose: CrudExpose,menuButtonRef:any }): CreateCrudOptionsTypes {
const hasPermissions = inject('$hasPermissions')
//验证路由地址 //验证路由地址
const validateWebPath = (rule: string, value: string, callback: Function) => { const validateWebPath = (rule: string, value: string, callback: Function) => {
const isLink = crudExpose.getFormData().is_link const isLink = crudExpose.getFormData().is_link
@@ -67,6 +69,13 @@ export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudE
load:loadContentMethod, load:loadContentMethod,
treeProps:{children: 'children', hasChildren: 'hasChild'} treeProps:{children: 'children', hasChildren: 'hasChild'}
}, },
actionbar: {
buttons: {
add: {
show: hasPermissions('Menu:Create')
}
}
},
rowHandle: { rowHandle: {
buttons: { buttons: {
custom: { custom: {
@@ -78,9 +87,10 @@ export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudE
}, },
show:compute(({row}:any)=>{ show:compute(({row}:any)=>{
if (row.web_path && !row.is_link) { if (row.web_path && !row.is_link) {
return true return true && hasPermissions()
} }
return false return false
}), }),
click:(context:any):void => { click:(context:any):void => {
const {row} = context const {row} = context