From 7c78c7e53fda6a3a0c2ae5415b7d40e493c3d2b3 Mon Sep 17 00:00:00 2001
From: H0nGzA1 <2505811377@qq.com>
Date: Tue, 28 Mar 2023 20:09:49 +0800
Subject: [PATCH] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20=E8=8F=9C?=
=?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86=E9=87=8D=E6=9E=84=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/dvadmin/system/views/menu.py | 27 ++-
web/src/views/system/menu/api.ts | 17 +-
web/src/views/system/menu/crud.tsx | 35 +--
web/src/views/system/menu/index.vue | 309 +++++++++++++++++++++++++--
4 files changed, 345 insertions(+), 43 deletions(-)
diff --git a/backend/dvadmin/system/views/menu.py b/backend/dvadmin/system/views/menu.py
index ae74af8..3566dde 100644
--- a/backend/dvadmin/system/views/menu.py
+++ b/backend/dvadmin/system/views/menu.py
@@ -53,9 +53,6 @@ class MenuCreateSerializer(CustomModelSerializer):
read_only_fields = ["id"]
-
-
-
class WebRouterSerializer(CustomModelSerializer):
"""
前端菜单路由的简单序列化器
@@ -63,11 +60,11 @@ class WebRouterSerializer(CustomModelSerializer):
path = serializers.CharField(source="web_path")
title = serializers.CharField(source="name")
-
class Meta:
model = Menu
- fields = ('id', 'parent', 'icon', 'sort', 'path', 'name', 'title', 'is_link', 'is_catalog', 'web_path', 'component',
- 'component_name', 'cache', 'visible')
+ fields = (
+ 'id', 'parent', 'icon', 'sort', 'path', 'name', 'title', 'is_link', 'is_catalog', 'web_path', 'component',
+ 'component_name', 'cache', 'visible', 'status')
read_only_fields = ["id"]
@@ -86,6 +83,7 @@ class MenuViewSet(CustomModelViewSet):
update_serializer_class = MenuCreateSerializer
search_fields = ['name', 'status']
filter_fields = ['parent', 'name', 'status', 'is_link', 'visible', 'cache', 'is_catalog']
+
# extra_filter_class = []
@action(methods=['GET'], detail=False, permission_classes=[])
@@ -101,12 +99,25 @@ class MenuViewSet(CustomModelViewSet):
data = serializer.data
return SuccessResponse(data=data, total=len(data), msg="获取成功")
- def list(self,request):
+ @action(methods=['GET'], detail=False, permission_classes=[])
+ def get_all_menu(self, request):
+ """用于菜单管理获取所有的菜单"""
+ user = request.user
+ queryset = self.queryset.all()
+ if not user.is_superuser:
+ role_list = user.role.values_list('id', flat=True)
+ menu_list = RoleMenuPermission.objects.filter(role__in=role_list).values_list('menu_id')
+ queryset = Menu.objects.filter(id__in=menu_list)
+ serializer = WebRouterSerializer(queryset, many=True, request=request)
+ data = serializer.data
+ return SuccessResponse(data=data, total=len(data), msg="获取成功")
+
+ def list(self, request):
"""懒加载"""
request.query_params._mutable = True
params = request.query_params
parent = params.get('parent', None)
- page = params.get('page',None)
+ page = params.get('page', None)
limit = params.get('limit', None)
if page:
del params['page']
diff --git a/web/src/views/system/menu/api.ts b/web/src/views/system/menu/api.ts
index 1df5890..8dbaf69 100644
--- a/web/src/views/system/menu/api.ts
+++ b/web/src/views/system/menu/api.ts
@@ -6,12 +6,20 @@ export function GetList(query: PageQuery) {
return request({
url: apiPrefix,
method: 'get',
- params: query
+ params: query,
});
}
+export function GetAllMenu(query: PageQuery) {
+ return request({
+ url: apiPrefix + 'get_all_menu/',
+ method: 'get',
+ params: query,
+ });
+}
+
export function GetObj(id: InfoReq) {
return request({
- url: apiPrefix + id+'/',
+ url: apiPrefix + id + '/',
method: 'get',
});
}
@@ -32,10 +40,9 @@ export function UpdateObj(obj: EditReq) {
});
}
-export function DelObj(id: DelReq) {
+export function DelObj(obj: DelReq) {
return request({
- url: apiPrefix + id + '/',
+ url: apiPrefix + obj.id + '/',
method: 'delete',
- data: { id },
});
}
diff --git a/web/src/views/system/menu/crud.tsx b/web/src/views/system/menu/crud.tsx
index 9727a3d..659698d 100644
--- a/web/src/views/system/menu/crud.tsx
+++ b/web/src/views/system/menu/crud.tsx
@@ -3,7 +3,7 @@ import { dict, PageQuery, AddReq, DelReq, EditReq, CrudExpose, CrudOptions } fro
import { dictionary } from '/@/utils/dictionary';
import { eIconPicker, eIcon } from 'e-icon-picker';
import { useCompute } from '@fast-crud/fast-crud';
-import { inject,computed } from 'vue';
+import { inject, computed } from 'vue';
import { apiPrefix as menuPrefix } from './api';
import XEUtils from 'xe-utils';
import { request } from '/@/utils/service';
@@ -81,9 +81,20 @@ export const createCrudOptions = function ({ crudExpose, menuButtonRef }: { crud
},
},
rowHandle: {
- fixed: "right",
- width: 310,
+ fixed: 'right',
+ width: 200,
buttons: {
+ view: {
+ show: false,
+ },
+ edit: {
+ iconRight: 'Edit',
+ type: 'text',
+ },
+ remove: {
+ iconRight: 'Delete',
+ type: 'text',
+ },
custom: {
text: '按钮配置',
type: 'warning',
@@ -104,15 +115,15 @@ export const createCrudOptions = function ({ crudExpose, menuButtonRef }: { crud
menuButtonRef.value.initGet();
},
},
- addChildren:{
- text: "添加子级",
- type:"warning",
- click(context){
- const rowId =context.row.id
- crudExpose.openAdd({ row: { parent: rowId } })
- }
- }
- }
+ addChildren: {
+ text: '添加子级',
+ type: 'text',
+ click(context) {
+ const rowId = context.row.id;
+ crudExpose.openAdd({ row: { parent: rowId } });
+ },
+ },
+ },
},
columns: {
_index: {
diff --git a/web/src/views/system/menu/index.vue b/web/src/views/system/menu/index.vue
index 1680ba0..88769b5 100644
--- a/web/src/views/system/menu/index.vue
+++ b/web/src/views/system/menu/index.vue
@@ -1,30 +1,303 @@
-
-
-
+
+
+
+
+ 菜单列表
+
+
+
+
+
+
+
+ {{ node.label }}
+ {{ node.label }}
+
+
+
+
+
+
+
+
+ 菜单配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+ 全选
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+ 新建
+ 添加子级
+ 添加同级
+ 删除菜单
+
+
+
+
+
+
+
+
+
+