1.完成初始化的配置

This commit is contained in:
猿小天
2023-10-29 20:09:56 +08:00
parent 212af88409
commit 75670f9a5e
11 changed files with 606 additions and 820 deletions

View File

@@ -400,7 +400,7 @@ TENANT_SHARED_APPS = []
PLUGINS_URL_PATTERNS = [] PLUGINS_URL_PATTERNS = []
# ********** 一键导入插件配置开始 ********** # ********** 一键导入插件配置开始 **********
# 例如: # 例如:
from dvadmin3_upgrade_center.settings import * # 升级中心 #from dvadmin3_upgrade_center.settings import * # 升级中心
# from dvadmin_celery.settings import * # celery 异步任务 # from dvadmin_celery.settings import * # celery 异步任务
# from dvadmin_third.settings import * # 第三方用户管理 # from dvadmin_third.settings import * # 第三方用户管理
# from dvadmin_ak_sk.settings import * # 秘钥管理管理 # from dvadmin_ak_sk.settings import * # 秘钥管理管理

View File

@@ -9,7 +9,7 @@ django.setup()
from dvadmin.system.models import ( from dvadmin.system.models import (
Role, Dept, Users, Menu, MenuButton, Role, Dept, Users, Menu, MenuButton,
ApiWhiteList, Dictionary, SystemConfig, ApiWhiteList, Dictionary, SystemConfig,
RoleMenuPermission, RoleMenuButtonPermission RoleMenuPermission, RoleApiPermission
) )
from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.serializers import CustomModelSerializer
@@ -42,24 +42,13 @@ class UsersInitSerializer(CustomModelSerializer):
} }
class MenuButtonInitSerializer(CustomModelSerializer):
"""
初始化菜单按钮-序列化器
"""
class Meta:
model = MenuButton
fields = ['id', 'name', 'value', 'api', 'method', 'menu']
read_only_fields = ["id"]
class MenuInitSerializer(CustomModelSerializer): class MenuInitSerializer(CustomModelSerializer):
""" """
递归深度获取数信息(用于生成初始化json文件) 递归深度获取数信息(用于生成初始化json文件)
""" """
name = serializers.CharField(required=False) name = serializers.CharField(required=True)
menu_type = serializers.IntegerField(required=True)
children = serializers.SerializerMethodField() children = serializers.SerializerMethodField()
menu_button = serializers.SerializerMethodField()
def get_children(self, obj: Menu): def get_children(self, obj: Menu):
data = [] data = []
@@ -69,26 +58,18 @@ class MenuInitSerializer(CustomModelSerializer):
data = serializer.data data = serializer.data
return data return data
def get_menu_button(self, obj: Menu):
data = []
instance = obj.menuPermission.order_by('method')
if instance:
data = list(instance.values('name', 'value', 'api', 'method'))
return data
def save(self, **kwargs): def save(self, **kwargs):
instance = super().save(**kwargs) instance = super().save(**kwargs)
children = self.initial_data.get('children') children = self.initial_data.get('children')
menu_button = self.initial_data.get('menu_button')
# 菜单表 # 菜单表
if children: if children:
for menu_data in children: for menu_data in children:
menu_data['parent'] = instance.id menu_data['parent'] = instance.id
filter_data = { filter_data = {
"name": menu_data['name'], "name": menu_data['name'],
"web_path": menu_data['web_path'],
"component": menu_data['component'], "component": menu_data['component'],
"component_name": menu_data['component_name'], "menu_type": menu_data['menu_type'],
} }
instance_obj = Menu.objects.filter(**filter_data).first() instance_obj = Menu.objects.filter(**filter_data).first()
if instance_obj and not self.initial_data.get('reset'): if instance_obj and not self.initial_data.get('reset'):
@@ -96,24 +77,12 @@ class MenuInitSerializer(CustomModelSerializer):
serializer = MenuInitSerializer(instance_obj, data=menu_data, request=self.request) serializer = MenuInitSerializer(instance_obj, data=menu_data, request=self.request)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
serializer.save() serializer.save()
# 菜单按钮
if menu_button:
for menu_button_data in menu_button:
menu_button_data['menu'] = instance.id
filter_data = {
"menu": menu_button_data['menu'],
"value": menu_button_data['value']
}
instance_obj = MenuButton.objects.filter(**filter_data).first()
serializer = MenuButtonInitSerializer(instance_obj, data=menu_button_data, request=self.request)
serializer.is_valid(raise_exception=True)
serializer.save()
return instance return instance
class Meta: class Meta:
model = Menu model = Menu
fields = ['name', 'icon', 'sort', 'is_link', 'menu_type', 'web_path', 'component', 'component_name', 'status', fields = ['name', 'icon', 'sort', 'is_link', 'menu_type', 'web_path', 'component', 'component_name', 'status',
'cache', 'visible', 'parent', 'children', 'menu_button', 'creator', 'dept_belong_id'] 'cache', 'visible', 'parent', 'children', 'creator', 'dept_belong_id']
extra_kwargs = { extra_kwargs = {
'creator': {'write_only': True}, 'creator': {'write_only': True},
'dept_belong_id': {'write_only': True} 'dept_belong_id': {'write_only': True}
@@ -128,7 +97,7 @@ class RoleInitSerializer(CustomModelSerializer):
class Meta: class Meta:
model = Role model = Role
fields = ['name', 'key', 'sort', 'status', 'admin', fields = ['name', 'key', 'sort', 'status',
'creator', 'dept_belong_id'] 'creator', 'dept_belong_id']
read_only_fields = ["id"] read_only_fields = ["id"]
extra_kwargs = { extra_kwargs = {
@@ -166,33 +135,31 @@ class RoleMenuInitSerializer(CustomModelSerializer):
} }
class RoleMenuButtonInitSerializer(CustomModelSerializer): class RoleApiPermissionInitSerializer(CustomModelSerializer):
""" """
初始化角色菜单按钮(用于生成初始化json文件) 初始化角色接口权限(用于生成初始化json文件)
""" """
role_key = serializers.CharField(max_length=100, required=True) role_key = serializers.CharField(max_length=100, required=True)
menu_button_value = serializers.CharField(max_length=100, required=True) name = serializers.CharField(max_length=255, required=True)
api = serializers.CharField(max_length=255, required=True)
method = serializers.IntegerField(required=True)
data_range = serializers.CharField(max_length=100, required=False) data_range = serializers.CharField(max_length=100, required=False)
def create(self, validated_data): def create(self, validated_data):
init_data = self.initial_data init_data = self.initial_data
validated_data.pop('menu_button_value')
validated_data.pop('role_key') validated_data.pop('role_key')
role_id = Role.objects.filter(key=init_data['role_key']).first() role_id = Role.objects.filter(key=init_data['role_key']).first()
menu_button_id = MenuButton.objects.filter(value=init_data['menu_button_value']).first()
validated_data['role'] = role_id validated_data['role'] = role_id
validated_data['menu_button'] = menu_button_id
instance = super().create(validated_data) instance = super().create(validated_data)
instance.dept.set([]) instance.dept.set([])
return instance return instance
class Meta: class Meta:
model = RoleMenuButtonPermission model = RoleApiPermission
fields = ['role_key', 'menu_button_value', 'data_range', 'dept', 'creator', 'dept_belong_id'] fields = ['role_key', 'name','api','method', 'data_range', 'dept', 'creator', 'dept_belong_id']
read_only_fields = ["id"] read_only_fields = ["id"]
extra_kwargs = { extra_kwargs = {
'role': {'required': False}, 'role': {'required': False},
'menu': {'required': False},
'creator': {'write_only': True}, 'creator': {'write_only': True},
'dept_belong_id': {'write_only': True} 'dept_belong_id': {'write_only': True}
} }

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,6 @@
"key": "admin", "key": "admin",
"sort": 1, "sort": 1,
"status": true, "status": true,
"admin": true,
"remark": null "remark": null
}, },
{ {
@@ -12,7 +11,6 @@
"key": "public", "key": "public",
"sort": 2, "sort": 2,
"status": true, "status": true,
"admin": true,
"remark": null "remark": null
} }
] ]

View File

@@ -0,0 +1,14 @@
[
{
"role_key": "admin",
"name": "菜单列表查询",
"api": "/api/system/menu/",
"method": 0
},
{
"role_key": "public",
"name": "菜单列表查询",
"api": "/api/system/menu/",
"method": 0
}
]

View File

@@ -1,12 +0,0 @@
[
{
"role_key": "admin",
"menu_button_value": "menu:Search",
"data_range": 0
},
{
"role_key": "public",
"menu_button_value":"menu:Search",
"data_range": 0
}
]

View File

@@ -11,7 +11,7 @@ from dvadmin.utils.core_initialize import CoreInitialize
from dvadmin.system.fixtures.initSerializer import ( from dvadmin.system.fixtures.initSerializer import (
UsersInitSerializer, DeptInitSerializer, RoleInitSerializer, UsersInitSerializer, DeptInitSerializer, RoleInitSerializer,
MenuInitSerializer, ApiWhiteListInitSerializer, DictionaryInitSerializer, MenuInitSerializer, ApiWhiteListInitSerializer, DictionaryInitSerializer,
SystemConfigInitSerializer, RoleMenuInitSerializer, RoleMenuButtonInitSerializer SystemConfigInitSerializer, RoleMenuInitSerializer, RoleApiPermissionInitSerializer
) )
@@ -39,7 +39,7 @@ class Initialize(CoreInitialize):
""" """
初始化菜单信息 初始化菜单信息
""" """
self.init_base(MenuInitSerializer, unique_fields=['name', 'web_path', 'component', 'component_name']) self.init_base(MenuInitSerializer, unique_fields=['name'])
def init_role_menu(self): def init_role_menu(self):
""" """
@@ -47,11 +47,11 @@ class Initialize(CoreInitialize):
""" """
self.init_base(RoleMenuInitSerializer, unique_fields=['role', 'menu']) self.init_base(RoleMenuInitSerializer, unique_fields=['role', 'menu'])
def init_role_menu_button(self): def init_role_api_permission(self):
""" """
初始化角色菜单按钮信息 初始化角色菜单按钮信息
""" """
self.init_base(RoleMenuButtonInitSerializer, unique_fields=['role', 'menu_button']) self.init_base(RoleApiPermissionInitSerializer, unique_fields=['role', 'api','name'])
def init_api_white_list(self): def init_api_white_list(self):
""" """
@@ -77,7 +77,7 @@ class Initialize(CoreInitialize):
self.init_users() self.init_users()
self.init_menu() self.init_menu()
self.init_role_menu() self.init_role_menu()
self.init_role_menu_button() self.init_role_api_permission()
self.init_api_white_list() self.init_api_white_list()
self.init_dictionary() self.init_dictionary()
self.init_system_config() self.init_system_config()

View File

@@ -13,7 +13,6 @@ class Role(CoreModel):
key = models.CharField(max_length=64, unique=True, verbose_name="权限字符", help_text="权限字符") key = models.CharField(max_length=64, unique=True, verbose_name="权限字符", help_text="权限字符")
sort = models.IntegerField(default=1, verbose_name="角色顺序", help_text="角色顺序") sort = models.IntegerField(default=1, verbose_name="角色顺序", help_text="角色顺序")
status = models.BooleanField(default=True, verbose_name="角色状态", help_text="角色状态") status = models.BooleanField(default=True, verbose_name="角色状态", help_text="角色状态")
admin = models.BooleanField(default=False, verbose_name="是否为admin", help_text="是否为admin")
class Meta: class Meta:
db_table = table_prefix + "system_role" db_table = table_prefix + "system_role"
@@ -165,7 +164,7 @@ class Menu(CoreModel):
(2, "按钮"), (2, "按钮"),
) )
menu_type = models.IntegerField(default=0, verbose_name="菜单类型", help_text="菜单类型") menu_type = models.IntegerField(default=0, verbose_name="菜单类型", help_text="菜单类型")
web_path = models.CharField(max_length=128, verbose_name="路由地址", null=True, blank=True, help_text="路由地址") web_path = models.CharField(max_length=128,default="/", verbose_name="路由地址", null=True, blank=True, help_text="路由地址")
component = models.CharField(max_length=200, verbose_name="组件地址/按钮权限值", null=True, blank=True, help_text="组件地址/按钮权限值") component = models.CharField(max_length=200, verbose_name="组件地址/按钮权限值", null=True, blank=True, help_text="组件地址/按钮权限值")
component_name = models.CharField(max_length=50, verbose_name="组件名称", null=True, blank=True, component_name = models.CharField(max_length=50, verbose_name="组件名称", null=True, blank=True,
help_text="组件名称") help_text="组件名称")
@@ -256,7 +255,7 @@ class RoleApiPermission(CoreModel):
role = models.ForeignKey( role = models.ForeignKey(
to="Role", to="Role",
db_constraint=False, db_constraint=False,
related_name="role_menu_button", related_name="role_api",
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name="关联角色", verbose_name="关联角色",
help_text="关联角色", help_text="关联角色",

View File

@@ -36,7 +36,7 @@ class ColumnViewSet(CustomModelViewSet):
return ErrorResponse(msg="参数错误") return ErrorResponse(msg="参数错误")
queryset = Columns.objects.filter(role_id=role_id, model=model_name, app=app_name) queryset = Columns.objects.filter(role_id=role_id, model=model_name, app=app_name)
serializer = ColumnSerializer(queryset, many=True, request=request) serializer = ColumnSerializer(queryset, many=True, request=request)
return DetailResponse(data=serializer.data, msg="获取成功") return SuccessResponse(data=serializer.data, msg="获取成功")
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
payload = request.data payload = request.data

View File

@@ -15,12 +15,14 @@
<div> <div>
<el-tabs type="border-card" v-model="permissionTab"> <el-tabs type="border-card" v-model="permissionTab">
<el-tab-pane label="菜单/按钮授权" name="menu"> <el-tab-pane label="菜单/按钮授权" name="menu">
<MenuPermission ref="menuPermissionRef" :role-id="props.roleId" @handleDrawerClose="handleDrawerClose"></MenuPermission> <MenuPermission ref="menuPermissionRef" :role-id="props.roleId" @handleDrawerClose="handleDrawerClose"></MenuPermission>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="请求接口授权" name="api"> <el-tab-pane label="请求接口授权" name="api">
<ApiPermission :role-id="props.roleId"></ApiPermission> <ApiPermission v-if="permissionTab==='api'" :role-id="props.roleId"></ApiPermission>
</el-tab-pane>
<el-tab-pane label="表单字段授权" name="field">
<FieldPermission v-if="permissionTab==='field'" :role-id="props.roleId"></FieldPermission>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="接口权限" name="column">角色管理</el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</el-drawer> </el-drawer>
@@ -33,6 +35,7 @@ import {errorNotification} from '/@/utils/message';
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import MenuPermission from "./MenuPermission/index.vue"; import MenuPermission from "./MenuPermission/index.vue";
import ApiPermission from "./ApiPermission/index.vue"; import ApiPermission from "./ApiPermission/index.vue";
import FieldPermission from "./FieldPermission/index.vue";
const props = defineProps({ const props = defineProps({
roleId: { roleId: {
type: Number, type: Number,

View File

@@ -56,31 +56,15 @@ export const createCrudOptions = function ({
show: true, show: true,
}, },
edit: { edit: {
show: hasPermissions('role:Update'), show: hasPermissions('role:update'),
}, },
remove: { remove: {
show: hasPermissions('role:Delete'), show: hasPermissions('role:delete'),
}, },
/* custom: {
type: 'primary',
text: '权限配置',
show: hasPermissions('role:Update'),
tooltip: {
placement: 'top',
content: '权限配置',
},
click: (context: any): void => {
const { row } = context;
// eslint-disable-next-line no-mixed-spaces-and-tabs
rolePermission.value.drawer = true;
rolePermission.value.editedRoleInfo = row;
rolePermission.value.initGet();
},
}, */
customNew: { customNew: {
type: 'primary', type: 'primary',
text: '授权', text: '授权',
show: hasPermissions('role:Update'), // show: hasPermissions('role:Update'),
click: (context: any): void => { click: (context: any): void => {
const { row } = context; const { row } = context;
handleDrawerOpen(row); handleDrawerOpen(row);