diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 1ffa0b6..7021007 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -201,6 +201,14 @@ class RoleMenuButtonPermission(CoreModel): verbose_name="关联角色", help_text="关联角色", ) + menu = models.ForeignKey( + to="Menu", + db_constraint=False, + related_name="role_menu", + on_delete=models.CASCADE, + verbose_name="关联菜单", + help_text="关联菜单", + ) menu_button = models.ForeignKey( to="MenuButton", db_constraint=False, @@ -208,6 +216,8 @@ class RoleMenuButtonPermission(CoreModel): on_delete=models.CASCADE, verbose_name="关联菜单按钮", help_text="关联菜单按钮", + null=True, + blank=True ) DATASCOPE_CHOICES = ( (0, "仅本人数据权限"), diff --git a/backend/dvadmin/system/urls.py b/backend/dvadmin/system/urls.py index 6b8c95f..9afc586 100644 --- a/backend/dvadmin/system/urls.py +++ b/backend/dvadmin/system/urls.py @@ -12,6 +12,7 @@ from dvadmin.system.views.menu_button import MenuButtonViewSet from dvadmin.system.views.message_center import MessageCenterViewSet from dvadmin.system.views.operation_log import OperationLogViewSet from dvadmin.system.views.role import RoleViewSet +from dvadmin.system.views.role_menu_button_permission import RoleMenuButtonPermissionViewSet from dvadmin.system.views.system_config import SystemConfigViewSet from dvadmin.system.views.user import UserViewSet @@ -28,6 +29,8 @@ system_url.register(r'file', FileViewSet) system_url.register(r'api_white_list', ApiWhiteListViewSet) system_url.register(r'system_config', SystemConfigViewSet) system_url.register(r'message_center',MessageCenterViewSet) +system_url.register(r'role_menu_button_permission', RoleMenuButtonPermissionViewSet) + urlpatterns = [ path('user/export/', UserViewSet.as_view({'post': 'export_data', })), diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py new file mode 100644 index 0000000..285b103 --- /dev/null +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- + +""" +@author: 猿小天 +@contact: QQ:1638245306 +@Created on: 2021/6/3 003 0:30 +@Remark: 菜单按钮管理 +""" +from django.db.models import F +from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated + +from dvadmin.system.models import RoleMenuButtonPermission, Menu, MenuButton +from dvadmin.utils.json_response import DetailResponse, ErrorResponse +from dvadmin.utils.serializers import CustomModelSerializer +from dvadmin.utils.viewset import CustomModelViewSet + + +class RoleMenuButtonPermissionSerializer(CustomModelSerializer): + """ + 菜单按钮-序列化器 + """ + + class Meta: + model = RoleMenuButtonPermission + fields = ['id', 'name', 'value', 'api', 'method'] + read_only_fields = ["id"] + + +class RoleMenuButtonPermissionInitSerializer(CustomModelSerializer): + """ + 初始化菜单按钮-序列化器 + """ + + class Meta: + model = RoleMenuButtonPermission + fields = ['id', 'name', 'value', 'api', 'method', 'menu'] + read_only_fields = ["id"] + +class RoleMenuButtonPermissionCreateUpdateSerializer(CustomModelSerializer): + """ + 初始化菜单按钮-序列化器 + """ + + class Meta: + model = RoleMenuButtonPermission + fields = "__all__" + read_only_fields = ["id"] + + +class RoleMenuButtonPermissionViewSet(CustomModelViewSet): + """ + 菜单按钮接口 + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = RoleMenuButtonPermission.objects.all() + serializer_class = RoleMenuButtonPermissionSerializer + create_serializer_class = RoleMenuButtonPermissionCreateUpdateSerializer + update_serializer_class = RoleMenuButtonPermissionCreateUpdateSerializer + extra_filter_backends = [] + + @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).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')) + return DetailResponse(data=queryset) + + @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) + def role_menu_get_button(self,request): + """根据角色和菜单获取菜单下的按钮""" + params = request.query_params + if params: + menu_id = params.get('menu',None) + if menu_id: + 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.filter(menu=menu_id).values('id', 'name') + else: + role_id = request.user.role.id + queryset = RoleMenuButtonPermission.objects.filter(role=role_id,menu=menu_id).values( + id=F('menu_button__id'), + name=F('menu_button__name') + ) + return DetailResponse(data=queryset) + return ErrorResponse(msg="参数错误") + + @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) + def data_scope(self, request): + is_superuser = request.user.is_superuser + if is_superuser: + data = [ + { + "value": 0, + "label": '仅本人数据权限' + }, + { + "value": 1, + "label": '本部门及以下数据权限' + }, + { + "value": 2, + "label": '本部门数据权限' + }, + { + "value": 3, + "label": '全部数据权限' + }, + { + "value": 4, + "label": '自定义数据权限' + } + ] + return DetailResponse(data=data) + else: + data = [] + role_id = request.user.role.id + params = request.query_params + if params: + menu_button_id = params.get('menu_button', None) + if menu_button_id: + role_queryset = RoleMenuButtonPermission.objects.filter(role=role_id,menu_button=menu_button_id).values_list('data_range',flat=True) + 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) + return ErrorResponse(msg="参数错误") + diff --git a/web/src/views/system/login/component/account.vue b/web/src/views/system/login/component/account.vue index 475beed..012c6b6 100644 --- a/web/src/views/system/login/component/account.vue +++ b/web/src/views/system/login/component/account.vue @@ -116,7 +116,7 @@ export default defineComponent({ }; const loginClick = async () => { loginApi.login({ ...state.ruleForm, password: Md5.hashStr(state.ruleForm.password) }).then((ret: any) => { - Session.set('token', ret.data.access); + Session.set('token', ret.data.access); Cookies.set('username', ret.data.name); if (!themeConfig.value.isRequestRoutes) { // 前端控制路由,2、请注意执行顺序 diff --git a/web/src/views/system/menu/index.vue b/web/src/views/system/menu/index.vue index 9d3ed65..a4af8ee 100644 --- a/web/src/views/system/menu/index.vue +++ b/web/src/views/system/menu/index.vue @@ -64,12 +64,9 @@ import { RouteRecordRaw } from 'vue-router'; import { ElMessageBox, ElMessage } from 'element-plus'; import { storeToRefs } from 'pinia'; import { useRoutesList } from '/@/stores/routesList'; -import AddMenu from '/@/views/system/menu/component/addMenu.vue'; -import EditMenu from '/@/views/system/menu/component/editMenu.vue'; export default defineComponent({ name: 'systemMenu', - components: { AddMenu, EditMenu }, setup() { const stores = useRoutesList(); const { routesList } = storeToRefs(stores); diff --git a/web/src/views/system/role/curd.tsx b/web/src/views/system/role/curd.tsx index 8c5543e..adf867c 100644 --- a/web/src/views/system/role/curd.tsx +++ b/web/src/views/system/role/curd.tsx @@ -82,8 +82,10 @@ export const createCrudOptions = function ({crudExpose,rolePermission}: {crudExp placement: "top", content: "删除" }, - click: () => { + click: (context:any) => { + const {row} = context rolePermission.value.drawer=true + rolePermission.value.editedRoleInfo = row rolePermission.value.initGet() } } diff --git a/web/src/views/system/rolePermission/api.ts b/web/src/views/system/rolePermission/api.ts index 0282726..61fcd55 100644 --- a/web/src/views/system/rolePermission/api.ts +++ b/web/src/views/system/rolePermission/api.ts @@ -6,7 +6,20 @@ import { request } from "/@/utils/service"; */ export function GetMenu(params:any) { return request({ - url: '/api/system/role/role_get_menu/', + url: '/api/system/role_menu_button_permission/role_get_menu/', + method: 'get', + params:params + }); +} + +/** + * 获取菜单下的按钮 + * @param params + * @constructor + */ +export function GetMenuButton(params:any) { + return request({ + url: '/api/system/role_menu_button_permission/role_menu_get_button/', method: 'get', params:params }); @@ -17,11 +30,11 @@ export function GetMenu(params:any) { * 根据角色获取数据权限范围 * @constructor */ -export function GetDataScope () { +export function GetDataScope (params:any={}) { return request({ - url: '/api/system/role/data_scope/', + url: '/api/system/role_menu_button_permission/data_scope/', method: 'get', - params: {} + params: params }) } diff --git a/web/src/views/system/rolePermission/index.vue b/web/src/views/system/rolePermission/index.vue index 8933078..0327a15 100644 --- a/web/src/views/system/rolePermission/index.vue +++ b/web/src/views/system/rolePermission/index.vue @@ -7,9 +7,10 @@ :before-close="handleClose" >
@@ -22,10 +23,8 @@ highlight-current :expand-on-click-node="false" :check-on-click-node="true" - :lazy="true" - :load="loadMenuNone" :props="defaultProps" - @node-click="menuNodeClick" + @current-change="menuNodeClick" /> @@ -34,7 +33,6 @@
@@ -84,9 +82,8 @@ - - - + + @@ -111,9 +108,9 @@ @@ -123,12 +120,16 @@