diff --git a/backend/application/settings.py b/backend/application/settings.py index 124d7f9..e518886 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -400,7 +400,7 @@ TENANT_SHARED_APPS = [] PLUGINS_URL_PATTERNS = [] # ********** 一键导入插件配置开始 ********** # 例如: -from dvadmin3_upgrade_center.settings import * # 升级中心 +#from dvadmin3_upgrade_center.settings import * # 升级中心 # from dvadmin_celery.settings import * # celery 异步任务 # from dvadmin_third.settings import * # 第三方用户管理 # from dvadmin_ak_sk.settings import * # 秘钥管理管理 diff --git a/backend/dvadmin/system/fixtures/initSerializer.py b/backend/dvadmin/system/fixtures/initSerializer.py index 35cf5f3..3b693b1 100644 --- a/backend/dvadmin/system/fixtures/initSerializer.py +++ b/backend/dvadmin/system/fixtures/initSerializer.py @@ -9,7 +9,7 @@ django.setup() from dvadmin.system.models import ( Role, Dept, Users, Menu, MenuButton, ApiWhiteList, Dictionary, SystemConfig, - RoleMenuPermission, RoleMenuButtonPermission + RoleMenuPermission, RoleApiPermission ) 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): """ 递归深度获取数信息(用于生成初始化json文件) """ - name = serializers.CharField(required=False) + name = serializers.CharField(required=True) + menu_type = serializers.IntegerField(required=True) children = serializers.SerializerMethodField() - menu_button = serializers.SerializerMethodField() def get_children(self, obj: Menu): data = [] @@ -69,26 +58,18 @@ class MenuInitSerializer(CustomModelSerializer): data = serializer.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): instance = super().save(**kwargs) children = self.initial_data.get('children') - menu_button = self.initial_data.get('menu_button') # 菜单表 if children: for menu_data in children: menu_data['parent'] = instance.id filter_data = { "name": menu_data['name'], - "web_path": menu_data['web_path'], "component": menu_data['component'], - "component_name": menu_data['component_name'], + "menu_type": menu_data['menu_type'], } instance_obj = Menu.objects.filter(**filter_data).first() 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.is_valid(raise_exception=True) 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 class Meta: model = Menu 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 = { 'creator': {'write_only': True}, 'dept_belong_id': {'write_only': True} @@ -128,7 +97,7 @@ class RoleInitSerializer(CustomModelSerializer): class Meta: model = Role - fields = ['name', 'key', 'sort', 'status', 'admin', + fields = ['name', 'key', 'sort', 'status', 'creator', 'dept_belong_id'] read_only_fields = ["id"] 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) - 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) def create(self, validated_data): init_data = self.initial_data - validated_data.pop('menu_button_value') validated_data.pop('role_key') 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['menu_button'] = menu_button_id instance = super().create(validated_data) instance.dept.set([]) return instance class Meta: - model = RoleMenuButtonPermission - fields = ['role_key', 'menu_button_value', 'data_range', 'dept', 'creator', 'dept_belong_id'] + model = RoleApiPermission + fields = ['role_key', 'name','api','method', 'data_range', 'dept', 'creator', 'dept_belong_id'] read_only_fields = ["id"] extra_kwargs = { 'role': {'required': False}, - 'menu': {'required': False}, 'creator': {'write_only': True}, 'dept_belong_id': {'write_only': True} } diff --git a/backend/dvadmin/system/fixtures/init_menu.json b/backend/dvadmin/system/fixtures/init_menu.json index 6e1c898..805e128 100644 --- a/backend/dvadmin/system/fixtures/init_menu.json +++ b/backend/dvadmin/system/fixtures/init_menu.json @@ -1,742 +1,575 @@ [ - { - "name": "系统管理", - "icon": "iconfont icon-xitongshezhi", + { + "name": "系统管理", + "icon": "iconfont icon-xitongshezhi", + "sort": 1, + "is_link": false, + "menu_type": 0, + "web_path": "/system", + "component": "", + "component_name": "", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "菜单管理", + "icon": "iconfont icon-caidan", "sort": 1, "is_link": false, - "menu_type": 0, - "web_path": "/system", - "component": "", - "component_name": "", + "menu_type": 1, + "web_path": "/menu", + "component": "system/menu/index", + "component_name": "menu", "status": true, "cache": false, "visible": true, "children": [ - { - "name": "菜单管理", - "icon": "iconfont icon-caidan", - "sort": 1, - "is_link": false, - "menu_type": 1, - "web_path": "/menu", - "component": "system/menu/index", - "component_name": "menu", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "menu:Search", - "api": "/api/system/menu/", - "method": 0 - }, - { - "name": "详情", - "value": "menu:Retrieve", - "api": "/api/system/menu/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "menu:Create", - "api": "/api/system/menu/", - "method": 1 - }, - { - "name": "编辑", - "value": "menu:Update", - "api": "/api/system/menu/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "menu:Delete", - "api": "/api/system/menu/{id}/", - "method": 3 - }, - { - "name": "查询所有", - "value": "menu:SearchAll", - "api": "/api/system/menu/get_all_menu/", - "method": 0 - }, - { - "name": "路由", - "value": "menu:router", - "api": "/api/system/menu/web_router/", - "method": 0 - }, - { - "name": "上移", - "value": "menu:MoveUp", - "api": "/api/system/menu/mode_up/", - "method": 1 - }, - { - "name": "下移", - "value": "menu:MoveDown", - "api": "/api/system/menu/mode_down/", - "method": 1 - } - ] - }, - { - "name": "菜单按钮", - "icon": "dot-circle-o", - "sort": 2, - "is_link": false, - "menu_type": 1, - "web_path": "/menuButton", - "component": "system/menuButton/index", - "component_name": "menuButton", - "status": true, - "cache": false, - "visible": false, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "menu_button:Search", - "api": "/api/system/menu_button/", - "method": 0 - }, - { - "name": "新增", - "value": "menu_button:Create", - "api": "/api/system/menu_button/", - "method": 1 - }, - { - "name": "编辑", - "value": "menu_button:Update", - "api": "/api/system/menu_button/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "menu_button:Delete", - "api": "/api/system/menu_button/{id}/", - "method": 3 - } - ] - }, - { - "name": "部门管理", - "icon": "ele-OfficeBuilding", - "sort": 3, - "is_link": false, - "menu_type": 1, - "web_path": "/dept", - "component": "system/dept/index", - "component_name": "dept", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "dept:Search", - "api": "/api/system/dept/", - "method": 0 - }, - { - "name": "详情", - "value": "dept:Retrieve", - "api": "/api/system/dept/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "dept:Create", - "api": "/api/system/dept/", - "method": 1 - }, - { - "name": "编辑", - "value": "dept:Update", - "api": "/api/system/dept/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "dept:Delete", - "api": "/api/system/dept/{id}/", - "method": 3 - }, - { - "name": "查询所有", - "value": "dept:SearchAll", - "api": "/api/system/dept/all_dept/", - "method": 0 - }, - { - "name": "懒加载查询所有", - "value": "dept:LazySearchAll", - "api": "/api/system/dept/dept_lazy_tree/", - "method": 0 - }, - { - "name": "上移", - "value": "dept:MoveUp", - "api": "/api/system/dept/mode_up/", - "method": 1 - }, - { - "name": "下移", - "value": "dept:MoveDown", - "api": "/api/system/dept/mode_down/", - "method": 1 - }, - { - "name": "头信息", - "value": "dept:HeaderInfo", - "api": "/api/system/dept/dept_info/", - "method": 0 - } - ] - }, - { - "name": "角色管理", - "icon": "ele-ColdDrink", - "sort": 4, - "is_link": false, - "menu_type": 1, - "web_path": "/role", - "component": "system/role/index", - "component_name": "role", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "role:Search", - "api": "/api/system/role/", - "method": 0 - }, - { - "name": "详情", - "value": "role:Retrieve", - "api": "/api/system/role/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "role:Create", - "api": "/api/system/role/", - "method": 1 - }, - { - "name": "编辑", - "value": "role:Update", - "api": "/api/system/role/{id}/", - "method": 2 - }, - { - "name": "保存", - "value": "role:Save", - "api": "/api/system/role/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "role:Delete", - "api": "/api/system/role/{id}/", - "method": 3 - } - ] - }, - { - "name": "列管理", - "icon": "iconfont icon-bolangneng", - "sort": 5, - "is_link": false, - "menu_type": 1, - "web_path": "/columns", - "component": "system/columns/index", - "component_name": "columns", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "column:Search", - "api": "/api/system/column/", - "method": 0 - }, - { - "name": "详情", - "value": "column:Retrieve", - "api": "/api/system/column/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "column:Create", - "api": "/api/system/column/", - "method": 1 - }, - { - "name": "编辑", - "value": "column:Update", - "api": "/api/system/column/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "column:Delete", - "api": "/api/system/column/{id}/", - "method": 3 - }, - { - "name": "所有模型表", - "value": "column:AllModel", - "api": "/api/system/column/get_models/", - "method": 0 - }, - { - "name": "自动匹配所有字段", - "value": "column:AutoMatch", - "api": "/api/system/column/auto_match_fields/", - "method": 1 - } - ] - }, - { - "name": "用户管理", - "icon": "iconfont icon-icon-", - "sort": 6, - "is_link": false, - "menu_type": 1, - "web_path": "/user", - "component": "system/user/index", - "component_name": "user", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "user:Search", - "api": "/api/system/user/", - "method": 0 - }, - { - "name": "详情", - "value": "user:Retrieve", - "api": "/api/system/user/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "user:Create", - "api": "/api/system/user/", - "method": 1 - }, - { - "name": "导出", - "value": "user:Export", - "api": "/api/system/user/export/", - "method": 1 - }, - { - "name": "导入", - "value": "user:Import", - "api": "/api/system/user/import/", - "method": 1 - }, - { - "name": "编辑", - "value": "user:Update", - "api": "/api/system/user/{id}/", - "method": 2 - }, - { - "name": "重设密码", - "value": "user:ResetPassword", - "api": "/api/system/user/{id}/reset_password/", - "method": 2 - }, - { - "name": "重置密码", - "value": "user:DefaultPassword", - "api": "/api/system/user/{id}/reset_to_default_password/", - "method": 2 - }, - { - "name": "删除", - "value": "user:Delete", - "api": "/api/system/user/{id}/", - "method": 3 - } - ] - }, - { - "name": "消息中心", - "icon": "iconfont icon-xiaoxizhongxin", - "sort": 7, - "is_link": false, - "menu_type": 1, - "web_path": "/messageCenter", - "component": "system/messageCenter/index", - "component_name": "messageCenter", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "messageCenter:Search", - "api": "/api/system/message_center/", - "method": 0 - }, - { - "name": "详情", - "value": "messageCenter:Retrieve", - "api": "/api/system/message_center/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "messageCenter:Create", - "api": "/api/system/message_center/", - "method": 1 - }, - { - "name": "编辑", - "value": "messageCenter:Update", - "api": "/api/system/message_center/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "messageCenter:Delete", - "api": "/api/system/menu/{id}/", - "method": 3 - } - ] - }, - { - "name": "接口白名单", - "icon": "ele-SetUp", - "sort": 8, - "is_link": false, - "menu_type": 1, - "web_path": "/apiWhiteList", - "component": "system/whiteList/index", - "component_name": "whiteList", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "api_white_list:Search", - "api": "/api/system/api_white_list/", - "method": 0 - }, - { - "name": "详情", - "value": "api_white_list:Retrieve", - "api": "/api/system/api_white_list/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "api_white_list:Create", - "api": "/api/system/api_white_list/", - "method": 1 - }, - { - "name": "编辑", - "value": "api_white_list:Update", - "api": "/api/system/api_white_list/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "api_white_list:Delete", - "api": "/api/system/api_white_list/{id}/", - "method": 3 - } - ] - } - ], - "menu_button": [] - }, - { - "name": "常规配置", - "icon": "iconfont icon-configure", - "sort": 2, - "is_link": false, - "menu_type": 0, - "web_path": "/generalConfig", - "component": "", - "component_name": "", - "status": true, - "cache": false, - "visible": true, - "children": [ - { - "name": "系统配置", - "icon": "iconfont icon-system", - "sort": 0, - "is_link": false, - "menu_type": 1, - "web_path": "/config", - "component": "system/config/index", - "component_name": "config", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "system_config:Search", - "api": "/api/system/system_config/", - "method": 0 - }, - { - "name": "详情", - "value": "system_config:Retrieve", - "api": "/api/system/system_config/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "system_config:Create", - "api": "/api/system/system_config/", - "method": 1 - }, - { - "name": "编辑", - "value": "system_config:Update", - "api": "/api/system/system_config/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "system_config:Delete", - "api": "/api/system/system_config/{id}/", - "method": 3 - } - ] - }, - { - "name": "字典管理", - "icon": "iconfont icon-dict", - "sort": 1, - "is_link": false, - "menu_type": 1, - "web_path": "/dictionary", - "component": "system/dictionary/index", - "component_name": "dictionary", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "dictionary:Search", - "api": "/api/system/dictionary/", - "method": 0 - }, - { - "name": "详情", - "value": "dictionary:Retrieve", - "api": "/api/system/dictionary/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "dictionary:Create", - "api": "/api/system/dictionary/", - "method": 1 - }, - { - "name": "编辑", - "value": "dictionary:Update", - "api": "/api/system/dictionary/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "dictionary:Delete", - "api": "/api/system/dictionary/{id}/", - "method": 3 - } - ] - }, - { - "name": "地区管理", - "icon": "iconfont icon-Area", - "sort": 2, - "is_link": false, - "menu_type": 1, - "web_path": "/areas", - "component": "system/areas/index", - "component_name": "areas", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "area:Search", - "api": "/api/system/area/", - "method": 0 - }, - { - "name": "详情", - "value": "area:Retrieve", - "api": "/api/system/area/{id}/", - "method": 0 - }, - { - "name": "新增", - "value": "area:Create", - "api": "/api/system/area/", - "method": 1 - }, - { - "name": "编辑", - "value": "area:Update", - "api": "/api/system/area/{id}/", - "method": 2 - }, - { - "name": "删除", - "value": "area:Delete", - "api": "/api/system/area/{id}/", - "method": 3 - } - ] - }, - { - "name": "附件管理", - "icon": "iconfont icon-file", - "sort": 3, - "is_link": false, - "menu_type": 1, - "web_path": "/file", - "component": "system/fileList/index", - "component_name": "file", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "详情", - "value": "file:Retrieve", - "api": "/api/system/file/{id}/", - "method": 0 - }, - { - "name": "查询", - "value": "file:Search", - "api": "/api/system/file/", - "method": 0 - }, - { - "name": "编辑", - "value": "file:Update", - "api": "/api/system/file/{id}/", - "method": 1 - }, - { - "name": "删除", - "value": "file:Delete", - "api": "/api/system/file/{id}/", - "method": 3 - } - ] - } - ], - "menu_button": [] - }, - { - "name": "日志管理", - "icon": "iconfont icon-rizhi", + { + "name": "查询", + "component": "menu:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "menu:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "menu:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "menu:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "menu:delete", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "部门管理", + "icon": "ele-OfficeBuilding", "sort": 3, "is_link": false, - "menu_type": 0, - "web_path": "/log", - "component": "", - "component_name": "", + "menu_type": 1, + "web_path": "/dept", + "component": "system/dept/index", + "component_name": "dept", "status": true, "cache": false, "visible": true, "children": [ - { - "name": "登录日志", - "icon": "iconfont icon-guanlidenglurizhi", - "sort": 1, - "is_link": false, - "menu_type": 1, - "web_path": "/loginLog", - "component": "system/log/loginLog/index", - "component_name": "loginLog", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "查询", - "value": "login_log:Search", - "api": "/api/system/login_log/", - "method": 0 - }, - { - "name": "详情", - "value": "login_log:Retrieve", - "api": "/api/system/login_log/{id}/", - "method": 0 - } - ] - }, - { - "name": "操作日志", - "icon": "iconfont icon-caozuorizhi", - "sort": 2, - "is_link": false, - "menu_type": 1, - "web_path": "/operationLog", - "component": "system/log/operationLog/index", - "component_name": "operationLog", - "status": true, - "cache": false, - "visible": true, - "children": [], - "menu_button": [ - { - "name": "详情", - "value": "operation_log:Retrieve", - "api": "/api/system/operation_log/{id}/", - "method": 0 - }, - { - "name": "查询", - "value": "operation_log:Search", - "api": "/api/system/operation_log/", - "method": 0 - } - ] - } - ], - "menu_button": [] - } + { + "name": "查询", + "component": "dept:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "dept:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "dept:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "dept:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "dept:delete", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "角色管理", + "icon": "ele-ColdDrink", + "sort": 4, + "is_link": false, + "menu_type": 1, + "web_path": "/role", + "component": "system/role/index", + "component_name": "role", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "查询", + "component": "role:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "role:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "role:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "role:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "保存", + "component": "role:Save", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "role:delete", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "用户管理", + "icon": "iconfont icon-icon-", + "sort": 6, + "is_link": false, + "menu_type": 1, + "web_path": "/user", + "component": "system/user/index", + "component_name": "user", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "查询", + "component": "user:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "user:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "user:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "导出", + "component": "user:Export", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "导入", + "component": "user:Import", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "user:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "重设密码", + "component": "user:ResetPassword", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "重置密码", + "component": "user:DefaultPassword", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "user:delete", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "消息中心", + "icon": "iconfont icon-xiaoxizhongxin", + "sort": 7, + "is_link": false, + "menu_type": 1, + "web_path": "/messageCenter", + "component": "system/messageCenter/index", + "component_name": "messageCenter", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "查询", + "component": "messageCenter:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "messageCenter:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "messageCenter:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "messageCenter:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "messageCenter:delete", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "接口白名单", + "icon": "ele-SetUp", + "sort": 8, + "is_link": false, + "menu_type": 1, + "web_path": "/apiWhiteList", + "component": "system/whiteList/index", + "component_name": "whiteList", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "查询", + "component": "api_white_list:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "api_white_list:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "api_white_list:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "api_white_list:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "api_white_list:delete", + "menu_type": 2, + "web_path": "/" + } + ] + } + ] + }, + { + "name": "常规配置", + "icon": "iconfont icon-configure", + "sort": 2, + "is_link": false, + "menu_type": 0, + "web_path": "/generalConfig", + "component": "", + "component_name": "", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "系统配置", + "icon": "iconfont icon-system", + "sort": 0, + "is_link": false, + "menu_type": 1, + "web_path": "/config", + "component": "system/config/index", + "component_name": "config", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "查询", + "component": "system_config:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "system_config:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "system_config:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "system_config:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "system_config:delete", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "字典管理", + "icon": "iconfont icon-dict", + "sort": 1, + "is_link": false, + "menu_type": 1, + "web_path": "/dictionary", + "component": "system/dictionary/index", + "component_name": "dictionary", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "查询", + "component": "dictionary:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "dictionary:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "dictionary:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "dictionary:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "dictionary:delete", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "地区管理", + "icon": "iconfont icon-Area", + "sort": 2, + "is_link": false, + "menu_type": 1, + "web_path": "/areas", + "component": "system/areas/index", + "component_name": "areas", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "查询", + "component": "area:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "area:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "新增", + "component": "area:create", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "area:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "area:delete", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "附件管理", + "icon": "iconfont icon-file", + "sort": 3, + "is_link": false, + "menu_type": 1, + "web_path": "/file", + "component": "system/fileList/index", + "component_name": "file", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "详情", + "component": "file:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "查询", + "component": "file:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "编辑", + "component": "file:update", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "删除", + "component": "file:delete", + "menu_type": 2, + "web_path": "/" + } + ] + } + ] + }, + { + "name": "日志管理", + "icon": "iconfont icon-rizhi", + "sort": 3, + "is_link": false, + "menu_type": 0, + "web_path": "/log", + "component": "no", + "component_name": "", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "登录日志", + "icon": "iconfont icon-guanlidenglurizhi", + "sort": 1, + "is_link": false, + "menu_type": 1, + "web_path": "/loginLog", + "component": "system/log/loginLog/index", + "component_name": "loginLog", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "查询", + "component": "login_log:search", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "详情", + "component": "login_log:retrieve", + "menu_type": 2, + "web_path": "/" + } + ] + }, + { + "name": "操作日志", + "icon": "iconfont icon-caozuorizhi", + "sort": 2, + "is_link": false, + "menu_type": 1, + "web_path": "/operationLog", + "component": "system/log/operationLog/index", + "component_name": "operationLog", + "status": true, + "cache": false, + "visible": true, + "children": [ + { + "name": "详情", + "component": "operation_log:retrieve", + "menu_type": 2, + "web_path": "/" + }, + { + "name": "查询", + "component": "operation_log:search", + "menu_type": 2, + "web_path": "/" + } + ] + } + ] + } ] \ No newline at end of file diff --git a/backend/dvadmin/system/fixtures/init_role.json b/backend/dvadmin/system/fixtures/init_role.json index 6fb63fe..f1678e5 100644 --- a/backend/dvadmin/system/fixtures/init_role.json +++ b/backend/dvadmin/system/fixtures/init_role.json @@ -4,7 +4,6 @@ "key": "admin", "sort": 1, "status": true, - "admin": true, "remark": null }, { @@ -12,7 +11,6 @@ "key": "public", "sort": 2, "status": true, - "admin": true, "remark": null } ] diff --git a/backend/dvadmin/system/fixtures/init_roleapipermission.json b/backend/dvadmin/system/fixtures/init_roleapipermission.json new file mode 100644 index 0000000..d252eb3 --- /dev/null +++ b/backend/dvadmin/system/fixtures/init_roleapipermission.json @@ -0,0 +1,14 @@ +[ + { + "role_key": "admin", + "name": "菜单列表查询", + "api": "/api/system/menu/", + "method": 0 + }, + { + "role_key": "public", + "name": "菜单列表查询", + "api": "/api/system/menu/", + "method": 0 + } +] diff --git a/backend/dvadmin/system/fixtures/init_rolemenubuttonpermission.json b/backend/dvadmin/system/fixtures/init_rolemenubuttonpermission.json deleted file mode 100644 index d4b4700..0000000 --- a/backend/dvadmin/system/fixtures/init_rolemenubuttonpermission.json +++ /dev/null @@ -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 - } -] diff --git a/backend/dvadmin/system/fixtures/initialize.py b/backend/dvadmin/system/fixtures/initialize.py index 74d89d7..a047418 100644 --- a/backend/dvadmin/system/fixtures/initialize.py +++ b/backend/dvadmin/system/fixtures/initialize.py @@ -11,7 +11,7 @@ from dvadmin.utils.core_initialize import CoreInitialize from dvadmin.system.fixtures.initSerializer import ( UsersInitSerializer, DeptInitSerializer, RoleInitSerializer, 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): """ @@ -47,11 +47,11 @@ class Initialize(CoreInitialize): """ 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): """ @@ -77,7 +77,7 @@ class Initialize(CoreInitialize): self.init_users() self.init_menu() self.init_role_menu() - self.init_role_menu_button() + self.init_role_api_permission() self.init_api_white_list() self.init_dictionary() self.init_system_config() diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 71d23fc..54ec566 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -13,7 +13,6 @@ class Role(CoreModel): key = models.CharField(max_length=64, unique=True, verbose_name="权限字符", help_text="权限字符") sort = models.IntegerField(default=1, 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: db_table = table_prefix + "system_role" @@ -165,7 +164,7 @@ class Menu(CoreModel): (2, "按钮"), ) 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_name = models.CharField(max_length=50, verbose_name="组件名称", null=True, blank=True, help_text="组件名称") @@ -256,7 +255,7 @@ class RoleApiPermission(CoreModel): role = models.ForeignKey( to="Role", db_constraint=False, - related_name="role_menu_button", + related_name="role_api", on_delete=models.CASCADE, verbose_name="关联角色", help_text="关联角色", diff --git a/backend/dvadmin/system/views/column.py b/backend/dvadmin/system/views/column.py index d414b27..97f82f4 100644 --- a/backend/dvadmin/system/views/column.py +++ b/backend/dvadmin/system/views/column.py @@ -36,7 +36,7 @@ class ColumnViewSet(CustomModelViewSet): return ErrorResponse(msg="参数错误") queryset = Columns.objects.filter(role_id=role_id, model=model_name, app=app_name) 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): payload = request.data diff --git a/web/src/views/system/role/components/index.vue b/web/src/views/system/role/components/index.vue index 5f123a1..6bc305a 100644 --- a/web/src/views/system/role/components/index.vue +++ b/web/src/views/system/role/components/index.vue @@ -15,12 +15,14 @@
- + - + + + + - 角色管理
@@ -33,6 +35,7 @@ import {errorNotification} from '/@/utils/message'; import {ElMessage} from 'element-plus' import MenuPermission from "./MenuPermission/index.vue"; import ApiPermission from "./ApiPermission/index.vue"; +import FieldPermission from "./FieldPermission/index.vue"; const props = defineProps({ roleId: { type: Number, diff --git a/web/src/views/system/role/crud.tsx b/web/src/views/system/role/crud.tsx index c7eaf97..057b406 100644 --- a/web/src/views/system/role/crud.tsx +++ b/web/src/views/system/role/crud.tsx @@ -56,31 +56,15 @@ export const createCrudOptions = function ({ show: true, }, edit: { - show: hasPermissions('role:Update'), + show: hasPermissions('role:update'), }, 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: { type: 'primary', text: '授权', - show: hasPermissions('role:Update'), + // show: hasPermissions('role:Update'), click: (context: any): void => { const { row } = context; handleDrawerOpen(row);