From ef4660c1f15586988da70bb2947722743a02fef5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com>
Date: Mon, 6 Feb 2023 22:21:55 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=98=E5=8C=96:=20?=
=?UTF-8?q?=E6=8E=88=E6=9D=83=E9=A1=B5=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/dvadmin/system/models.py | 10 +
backend/dvadmin/system/urls.py | 3 +
.../views/role_menu_button_permission.py | 183 ++++++++++++++++++
.../views/system/login/component/account.vue | 2 +-
web/src/views/system/menu/index.vue | 3 -
web/src/views/system/role/curd.tsx | 4 +-
web/src/views/system/rolePermission/api.ts | 21 +-
web/src/views/system/rolePermission/index.vue | 104 ++++++----
8 files changed, 285 insertions(+), 45 deletions(-)
create mode 100644 backend/dvadmin/system/views/role_menu_button_permission.py
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"
>
-
-
+