From 7f0ffffafc7b03f5e495c34f257229a8c25311a8 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, 20 Feb 2023 22:59:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=98=E5=8C=96:=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=88=9D=E5=A7=8B=E5=8C=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dvadmin/system/fixtures/initSerializer.py | 341 ++++++++++++++++++ .../dvadmin/system/fixtures/init_menu.json | 124 +++---- .../init_rolemenubuttonpermission.json | 12 + .../fixtures/init_rolemenupermission.json | 10 + backend/dvadmin/system/fixtures/initialize.py | 26 +- .../management/commands/generate_init_json.py | 11 +- backend/dvadmin/system/models.py | 100 +++-- .../dvadmin/system/views/api_white_list.py | 12 - backend/dvadmin/system/views/dept.py | 42 --- backend/dvadmin/system/views/dictionary.py | 41 --- backend/dvadmin/system/views/login.py | 2 +- backend/dvadmin/system/views/menu.py | 66 ---- backend/dvadmin/system/views/menu_button.py | 8 - backend/dvadmin/system/views/role.py | 13 - backend/dvadmin/system/views/system_config.py | 42 --- backend/dvadmin/system/views/user.py | 25 -- backend/dvadmin/utils/core_initialize.py | 1 + 17 files changed, 514 insertions(+), 362 deletions(-) create mode 100644 backend/dvadmin/system/fixtures/initSerializer.py create mode 100644 backend/dvadmin/system/fixtures/init_rolemenubuttonpermission.json create mode 100644 backend/dvadmin/system/fixtures/init_rolemenupermission.json diff --git a/backend/dvadmin/system/fixtures/initSerializer.py b/backend/dvadmin/system/fixtures/initSerializer.py new file mode 100644 index 0000000..28a1dc5 --- /dev/null +++ b/backend/dvadmin/system/fixtures/initSerializer.py @@ -0,0 +1,341 @@ +# -*- coding: utf-8 -*- +import os + +from rest_framework import serializers + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings') +import django +django.setup() +from dvadmin.system.models import Role, Dept, Users, Menu, MenuButton, ApiWhiteList, Dictionary, SystemConfig, \ + RoleMenuPermission, RoleMenuButtonPermission +from dvadmin.utils.serializers import CustomModelSerializer + + +class UsersInitSerializer(CustomModelSerializer): + """ + 初始化获取数信息(用于生成初始化json文件) + """ + + def save(self, **kwargs): + instance = super().save(**kwargs) + role_key = self.initial_data.get('role_key', []) + role_ids = Role.objects.filter(key__in=role_key).values_list('id', flat=True) + instance.role.set(role_ids) + dept_key = self.initial_data.get('dept_key', None) + dept_id = Dept.objects.filter(key=dept_key).first() + instance.dept = dept_id + instance.save() + return instance + + class Meta: + model = Users + fields = ["username", "email", 'mobile', 'avatar', "name", 'gender', 'user_type', "dept", 'user_type', + 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'creator', 'dept_belong_id', + 'password', 'last_login', 'is_superuser'] + read_only_fields = ['id'] + extra_kwargs = { + 'creator': {'write_only': True}, + 'dept_belong_id': {'write_only': True} + } + + +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) + children = serializers.SerializerMethodField() + menu_button = serializers.SerializerMethodField() + + def get_children(self, obj: Menu): + data = [] + instance = Menu.objects.filter(parent_id=obj.id) + if instance: + serializer = MenuInitSerializer(instance=instance, many=True) + 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'], + } + instance_obj = Menu.objects.filter(**filter_data).first() + if instance_obj and not self.initial_data.get('reset'): + continue + 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', 'is_catalog', 'web_path', 'component', 'component_name', 'status', + 'cache', 'visible', 'parent', 'children', 'menu_button', 'creator', 'dept_belong_id'] + extra_kwargs = { + 'creator': {'write_only': True}, + 'dept_belong_id': {'write_only': True} + } + read_only_fields = ['id', 'children'] + + +class RoleInitSerializer(CustomModelSerializer): + """ + 初始化获取数信息(用于生成初始化json文件) + """ + + class Meta: + model = Role + fields = ['name', 'key', 'sort', 'status', 'admin', + 'creator', 'dept_belong_id'] + read_only_fields = ["id"] + extra_kwargs = { + 'creator': {'write_only': True}, + 'dept_belong_id': {'write_only': True} + } + + +class RoleMenuInitSerializer(CustomModelSerializer): + """ + 初始化角色菜单(用于生成初始化json文件) + """ + role_key = serializers.CharField(max_length=100,required=True) + menu_component_name = serializers.CharField(max_length=100,required=True) + + def create(self, validated_data): + init_data = self.initial_data + validated_data['menu_component_name'].pop() + role_id = Role.objects.filter(key=init_data['role_key']).first() + menu_id = Menu.objects.filter(component_name=init_data['menu_component_name']).first() + validated_data['role'] = role_id + validated_data['menu'] = menu_id + return super().create(validated_data) + + class Meta: + model = RoleMenuPermission + fields = ['role_key','menu_component_name','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} + } + + +class RoleMenuButtonInitSerializer(CustomModelSerializer): + """ + 初始化角色菜单按钮(用于生成初始化json文件) + """ + role_key = serializers.CharField(max_length=100,required=True) + menu_button_value = serializers.CharField(max_length=100,required=True) + data_range = serializers.CharField(max_length=100, required=False) + + def create(self, validated_data): + role_id = Role.objects.filter(key=validated_data['role_key']).first() + menu_button_id = RoleMenuButtonPermission.objects.filter(value=validated_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'] + read_only_fields = ["id"] + extra_kwargs = { + 'role': {'required': False}, + 'menu': {'required': False}, + 'creator': {'write_only': True}, + 'dept_belong_id': {'write_only': True} + } + + + +class ApiWhiteListInitSerializer(CustomModelSerializer): + """ + 初始化获取数信息(用于生成初始化json文件) + """ + + class Meta: + model = ApiWhiteList + fields = ['url', 'method', 'enable_datasource', 'creator', 'dept_belong_id'] + read_only_fields = ["id"] + extra_kwargs = { + 'creator': {'write_only': True}, + 'dept_belong_id': {'write_only': True} + } + + +class DeptInitSerializer(CustomModelSerializer): + """ + 递归深度获取数信息(用于生成初始化json文件) + """ + children = serializers.SerializerMethodField() + + def get_children(self, obj: Dept): + data = [] + instance = Dept.objects.filter(parent_id=obj.id) + if instance: + serializer = DeptInitSerializer(instance=instance, many=True) + data = serializer.data + return data + + def save(self, **kwargs): + instance = super().save(**kwargs) + children = self.initial_data.get('children') + if children: + for menu_data in children: + menu_data['parent'] = instance.id + filter_data = { + "name": menu_data['name'], + "parent": menu_data['parent'], + "key": menu_data['key'] + } + instance_obj = Dept.objects.filter(**filter_data).first() + if instance_obj and not self.initial_data.get('reset'): + continue + serializer = DeptInitSerializer(instance_obj, data=menu_data, request=self.request) + serializer.is_valid(raise_exception=True) + serializer.save() + + return instance + + class Meta: + model = Dept + fields = ['name', 'sort', 'owner', 'phone', 'email', 'status', 'parent', 'creator', 'dept_belong_id', + 'children', 'key'] + extra_kwargs = { + 'creator': {'write_only': True}, + 'dept_belong_id': {'write_only': True} + } + read_only_fields = ['id', 'children'] + + +class DictionaryInitSerializer(CustomModelSerializer): + """ + 初始化获取数信息(用于生成初始化json文件) + """ + children = serializers.SerializerMethodField() + + def get_children(self, obj: Dictionary): + data = [] + instance = Dictionary.objects.filter(parent_id=obj.id) + if instance: + serializer = DictionaryInitSerializer(instance=instance, many=True) + data = serializer.data + return data + + def save(self, **kwargs): + instance = super().save(**kwargs) + children = self.initial_data.get('children') + # 菜单表 + if children: + for data in children: + data['parent'] = instance.id + filter_data = { + "value": data['value'], + "parent": data['parent'] + } + instance_obj = Dictionary.objects.filter(**filter_data).first() + if instance_obj and not self.initial_data.get('reset'): + continue + serializer = DictionaryInitSerializer(instance_obj, data=data, request=self.request) + serializer.is_valid(raise_exception=True) + serializer.save() + return instance + + class Meta: + model = Dictionary + fields = ['label', 'value', 'parent', 'type', 'color', 'is_value', 'status', 'sort', 'remark', 'creator', + 'dept_belong_id', 'children'] + read_only_fields = ["id"] + extra_kwargs = { + 'creator': {'write_only': True}, + 'dept_belong_id': {'write_only': True} + } + + +class SystemConfigInitSerializer(CustomModelSerializer): + """ + 初始化获取数信息(用于生成初始化json文件) + """ + children = serializers.SerializerMethodField() + + def get_children(self, obj: SystemConfig): + data = [] + instance = SystemConfig.objects.filter(parent_id=obj.id) + if instance: + serializer = SystemConfigInitSerializer(instance=instance, many=True) + data = serializer.data + return data + + def save(self, **kwargs): + instance = super().save(**kwargs) + children = self.initial_data.get('children') + # 菜单表 + if children: + for data in children: + data['parent'] = instance.id + filter_data = { + "key": data['key'], + "parent": data['parent'] + } + instance_obj = SystemConfig.objects.filter(**filter_data).first() + if instance_obj and not self.initial_data.get('reset'): + continue + serializer = SystemConfigInitSerializer(instance_obj, data=data, request=self.request) + serializer.is_valid(raise_exception=True) + serializer.save() + return instance + + class Meta: + model = SystemConfig + fields = ['parent', 'title', 'key', 'value', 'sort', 'status', 'data_options', 'form_item_type', 'rule', + 'placeholder', 'setting', 'creator', 'dept_belong_id', 'children'] + read_only_fields = ["id"] + extra_kwargs = { + '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 121ec44..caa6678 100644 --- a/backend/dvadmin/system/fixtures/init_menu.json +++ b/backend/dvadmin/system/fixtures/init_menu.json @@ -30,31 +30,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "menu:Search", "api": "/api/system/menu/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "menu:Retrieve", "api": "/api/system/menu/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "menu:Create", "api": "/api/system/menu/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "menu:Update", "api": "/api/system/menu/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "menu:Delete", "api": "/api/system/menu/{id}/", "method": 3 } @@ -77,25 +77,25 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "menu_button:Search", "api": "/api/system/menu_button/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "menu_button:Create", "api": "/api/system/menu_button/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "menu_button:Update", "api": "/api/system/menu_button/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "menu_button:Delete", "api": "/api/system/menu_button/{id}/", "method": 3 } @@ -118,31 +118,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "dept:Search", "api": "/api/system/dept/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "dept:Retrieve", "api": "/api/system/dept/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "dept:Create", "api": "/api/system/dept/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "dept:Update", "api": "/api/system/dept/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "dept:Delete", "api": "/api/system/dept/{id}/", "method": 3 } @@ -165,37 +165,37 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "role:Search", "api": "/api/system/role/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "role:Retrieve", "api": "/api/system/role/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "role:Create", "api": "/api/system/role/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "role:Update", "api": "/api/system/role/{id}/", "method": 2 }, { "name": "保存", - "value": "Save", + "value": "role:Save", "api": "/api/system/role/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "role:Delete", "api": "/api/system/role/{id}/", "method": 3 } @@ -218,55 +218,55 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "user:Search", "api": "/api/system/user/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "user:Retrieve", "api": "/api/system/user/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "user:Create", "api": "/api/system/user/", "method": 1 }, { "name": "导出", - "value": "Export", + "value": "user:Export", "api": "/api/system/user/export/", "method": 1 }, { "name": "导入", - "value": "Import", + "value": "user:Import", "api": "/api/system/user/import/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "user:Update", "api": "/api/system/user/{id}/", "method": 2 }, { "name": "重设密码", - "value": "ResetPassword", + "value": "user:ResetPassword", "api": "/api/system/user/{id}/reset_password/", "method": 2 }, { "name": "重置密码", - "value": "DefaultPassword", + "value": "user:DefaultPassword", "api": "/api/system/user/{id}/reset_to_default_password/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "user:Delete", "api": "/api/system/user/{id}/", "method": 3 } @@ -289,31 +289,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "menu:Search", "api": "/api/system/message_center/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "menu:Retrieve", "api": "/api/system/message_center/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "menu:Create", "api": "/api/system/message_center/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "menu:Update", "api": "/api/system/message_center/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "menu:Delete", "api": "/api/system/menu/{id}/", "method": 3 } @@ -336,31 +336,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "api_white_list:Search", "api": "/api/system/api_white_list/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "api_white_list:Retrieve", "api": "/api/system/api_white_list/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "api_white_list:Create", "api": "/api/system/api_white_list/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "api_white_list:Update", "api": "/api/system/api_white_list/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "api_white_list:Delete", "api": "/api/system/api_white_list/{id}/", "method": 3 } @@ -400,31 +400,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "system_config:Search", "api": "/api/system/system_config/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "system_config:Retrieve", "api": "/api/system/system_config/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "system_config:Create", "api": "/api/system/system_config/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "system_config:Update", "api": "/api/system/system_config/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "system_config:Delete", "api": "/api/system/system_config/{id}/", "method": 3 } @@ -447,31 +447,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "dictionary:Search", "api": "/api/system/dictionary/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "dictionary:Retrieve", "api": "/api/system/dictionary/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "dictionary:Create", "api": "/api/system/dictionary/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "dictionary:Update", "api": "/api/system/dictionary/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "dictionary:Delete", "api": "/api/system/dictionary/{id}/", "method": 3 } @@ -494,31 +494,31 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "area:Search", "api": "/api/system/area/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "area:Retrieve", "api": "/api/system/area/{id}/", "method": 0 }, { "name": "新增", - "value": "Create", + "value": "area:Create", "api": "/api/system/area/", "method": 1 }, { "name": "编辑", - "value": "Update", + "value": "area:Update", "api": "/api/system/area/{id}/", "method": 2 }, { "name": "删除", - "value": "Delete", + "value": "area:Delete", "api": "/api/system/area/{id}/", "method": 3 } @@ -541,25 +541,25 @@ "menu_button": [ { "name": "详情", - "value": "Retrieve", + "value": "file:Retrieve", "api": "/api/system/file/{id}/", "method": 0 }, { "name": "查询", - "value": "Search", + "value": "file:Search", "api": "/api/system/file/", "method": 0 }, { "name": "编辑", - "value": "Update", + "value": "file:Update", "api": "/api/system/file/{id}/", "method": 1 }, { "name": "删除", - "value": "Delete", + "value": "file:Delete", "api": "/api/system/file/{id}/", "method": 3 } @@ -599,13 +599,13 @@ "menu_button": [ { "name": "查询", - "value": "Search", + "value": "login_log:Search", "api": "/api/system/login_log/", "method": 0 }, { "name": "详情", - "value": "Retrieve", + "value": "login_log:Retrieve", "api": "/api/system/login_log/{id}/", "method": 0 } @@ -628,13 +628,13 @@ "menu_button": [ { "name": "详情", - "value": "Retrieve", + "value": "operation_log:Retrieve", "api": "/api/system/operation_log/{id}/", "method": 0 }, { "name": "查询", - "value": "Search", + "value": "operation_log:Search", "api": "/api/system/operation_log/", "method": 0 } diff --git a/backend/dvadmin/system/fixtures/init_rolemenubuttonpermission.json b/backend/dvadmin/system/fixtures/init_rolemenubuttonpermission.json new file mode 100644 index 0000000..d4b4700 --- /dev/null +++ b/backend/dvadmin/system/fixtures/init_rolemenubuttonpermission.json @@ -0,0 +1,12 @@ +[ + { + "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/init_rolemenupermission.json b/backend/dvadmin/system/fixtures/init_rolemenupermission.json new file mode 100644 index 0000000..8d09e8d --- /dev/null +++ b/backend/dvadmin/system/fixtures/init_rolemenupermission.json @@ -0,0 +1,10 @@ +[ + { + "role_key": "admin", + "menu_component_name": "menu" + }, + { + "role_key": "public", + "menu_component_name": "menu" + } +] diff --git a/backend/dvadmin/system/fixtures/initialize.py b/backend/dvadmin/system/fixtures/initialize.py index e8dc122..45cc103 100644 --- a/backend/dvadmin/system/fixtures/initialize.py +++ b/backend/dvadmin/system/fixtures/initialize.py @@ -3,17 +3,14 @@ import os import django + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "application.settings") django.setup() -from dvadmin.system.views.user import UsersInitSerializer -from dvadmin.system.views.menu import MenuInitSerializer from dvadmin.utils.core_initialize import CoreInitialize -from dvadmin.system.views.role import RoleInitSerializer -from dvadmin.system.views.api_white_list import ApiWhiteListInitSerializer -from dvadmin.system.views.dept import DeptInitSerializer -from dvadmin.system.views.dictionary import DictionaryInitSerializer -from dvadmin.system.views.system_config import SystemConfigInitSerializer +from dvadmin.system.fixtures.initSerializer import UsersInitSerializer, DeptInitSerializer, RoleInitSerializer, \ + MenuInitSerializer, ApiWhiteListInitSerializer, DictionaryInitSerializer, SystemConfigInitSerializer, \ + RoleMenuInitSerializer, RoleMenuButtonInitSerializer class Initialize(CoreInitialize): @@ -42,6 +39,19 @@ class Initialize(CoreInitialize): """ self.init_base(MenuInitSerializer, unique_fields=['name', 'web_path', 'component', 'component_name']) + def init_role_menu(self): + """ + 初始化角色菜单信息 + """ + self.init_base(RoleMenuInitSerializer, unique_fields=['role', 'menu']) + + def init_role_menu_button(self): + """ + 初始化角色菜单按钮信息 + """ + self.init_base(RoleMenuButtonInitSerializer, unique_fields=['role', 'menu_button']) + + def init_api_white_list(self): """ 初始API白名单 @@ -65,6 +75,8 @@ class Initialize(CoreInitialize): self.init_role() self.init_users() self.init_menu() + self.init_role_menu() + self.init_role_menu_button() self.init_api_white_list() self.init_dictionary() self.init_system_config() diff --git a/backend/dvadmin/system/management/commands/generate_init_json.py b/backend/dvadmin/system/management/commands/generate_init_json.py index 6b265ef..b074344 100644 --- a/backend/dvadmin/system/management/commands/generate_init_json.py +++ b/backend/dvadmin/system/management/commands/generate_init_json.py @@ -5,20 +5,15 @@ import os import django from django.db.models import QuerySet -from dvadmin.system.views.system_config import SystemConfigInitSerializer - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings') django.setup() from django.core.management.base import BaseCommand from application.settings import BASE_DIR from dvadmin.system.models import Menu, Users, Dept, Role, ApiWhiteList, Dictionary, SystemConfig -from dvadmin.system.views.api_white_list import ApiWhiteListInitSerializer -from dvadmin.system.views.dept import DeptInitSerializer -from dvadmin.system.views.dictionary import DictionaryInitSerializer -from dvadmin.system.views.menu import MenuInitSerializer -from dvadmin.system.views.role import RoleInitSerializer -from dvadmin.system.views.user import UsersInitSerializer +from dvadmin.system.fixtures.initSerializer import UsersInitSerializer, DeptInitSerializer, RoleInitSerializer, \ + MenuInitSerializer, ApiWhiteListInitSerializer, DictionaryInitSerializer, SystemConfigInitSerializer, \ + RoleMenuInitSerializer, RoleMenuButtonInitSerializer logger = logging.getLogger(__name__) diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 3f4b766..a33814f 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -13,8 +13,9 @@ STATUS_CHOICES = ( ) -class Users(CoreModel,AbstractUser): - username = models.CharField(max_length=150, unique=True, db_index=True, verbose_name="用户账号", help_text="用户账号") +class Users(CoreModel, AbstractUser): + username = models.CharField(max_length=150, unique=True, db_index=True, verbose_name="用户账号", + help_text="用户账号") email = models.EmailField(max_length=255, verbose_name="邮箱", null=True, blank=True, help_text="邮箱") mobile = models.CharField(max_length=255, verbose_name="电话", null=True, blank=True, help_text="电话") avatar = models.CharField(max_length=255, verbose_name="头像", null=True, blank=True, help_text="头像") @@ -34,8 +35,10 @@ class Users(CoreModel,AbstractUser): user_type = models.IntegerField( choices=USER_TYPE, default=0, verbose_name="用户类型", null=True, blank=True, help_text="用户类型" ) - post = models.ManyToManyField(to="Post",blank=True, verbose_name="关联岗位", db_constraint=False, help_text="关联岗位") - role = models.ManyToManyField(to="Role", blank=True,verbose_name="关联角色", db_constraint=False, help_text="关联角色") + post = models.ManyToManyField(to="Post", blank=True, verbose_name="关联岗位", db_constraint=False, + help_text="关联岗位") + role = models.ManyToManyField(to="Role", blank=True, verbose_name="关联角色", db_constraint=False, + help_text="关联角色") dept = models.ForeignKey( to="Dept", verbose_name="所属部门", @@ -89,7 +92,8 @@ class Role(CoreModel): class Dept(CoreModel): name = models.CharField(max_length=64, verbose_name="部门名称", help_text="部门名称") - key = models.CharField(max_length=64, unique=True,null=True,blank=True, verbose_name="关联字符", help_text="关联字符") + key = models.CharField(max_length=64, unique=True, null=True, blank=True, verbose_name="关联字符", + help_text="关联字符") sort = models.IntegerField(default=1, verbose_name="显示排序", help_text="显示排序") owner = models.CharField(max_length=32, verbose_name="负责人", null=True, blank=True, help_text="负责人") phone = models.CharField(max_length=32, verbose_name="联系电话", null=True, blank=True, help_text="联系电话") @@ -153,10 +157,12 @@ class Menu(CoreModel): is_catalog = models.BooleanField(default=False, verbose_name="是否目录", help_text="是否目录") web_path = models.CharField(max_length=128, verbose_name="路由地址", null=True, blank=True, help_text="路由地址") component = models.CharField(max_length=128, verbose_name="组件地址", null=True, blank=True, help_text="组件地址") - component_name = models.CharField(max_length=50, verbose_name="组件名称", null=True, blank=True, help_text="组件名称") + component_name = models.CharField(max_length=50, verbose_name="组件名称", null=True, blank=True, + help_text="组件名称") status = models.BooleanField(default=True, blank=True, verbose_name="菜单状态", help_text="菜单状态") cache = models.BooleanField(default=False, blank=True, verbose_name="是否页面缓存", help_text="是否页面缓存") - visible = models.BooleanField(default=True, blank=True, verbose_name="侧边栏中是否显示", help_text="侧边栏中是否显示") + visible = models.BooleanField(default=True, blank=True, verbose_name="侧边栏中是否显示", + help_text="侧边栏中是否显示") class Meta: db_table = table_prefix + "system_menu" @@ -175,7 +181,7 @@ class MenuButton(CoreModel): help_text="关联菜单", ) name = models.CharField(max_length=64, verbose_name="名称", help_text="名称") - value = models.CharField(unique=True,max_length=64, verbose_name="权限值", help_text="权限值") + value = models.CharField(unique=True, max_length=64, verbose_name="权限值", help_text="权限值") api = models.CharField(max_length=200, verbose_name="接口地址", help_text="接口地址") METHOD_CHOICES = ( (0, "GET"), @@ -183,7 +189,8 @@ class MenuButton(CoreModel): (2, "PUT"), (3, "DELETE"), ) - method = models.IntegerField(default=0, verbose_name="接口请求方法", null=True, blank=True, help_text="接口请求方法") + method = models.IntegerField(default=0, verbose_name="接口请求方法", null=True, blank=True, + help_text="接口请求方法") class Meta: db_table = table_prefix + "system_menu_button" @@ -191,6 +198,7 @@ class MenuButton(CoreModel): verbose_name_plural = verbose_name ordering = ("-name",) + class RoleMenuPermission(CoreModel): role = models.ForeignKey( to="Role", @@ -208,12 +216,14 @@ class RoleMenuPermission(CoreModel): verbose_name="关联菜单", help_text="关联菜单", ) + class Meta: db_table = table_prefix + "role_menu_permission" verbose_name = "角色菜单权限表" verbose_name_plural = verbose_name ordering = ("-create_datetime",) + class RoleMenuButtonPermission(CoreModel): role = models.ForeignKey( to="Role", @@ -242,14 +252,16 @@ class RoleMenuButtonPermission(CoreModel): ) data_range = models.IntegerField(default=0, choices=DATASCOPE_CHOICES, verbose_name="数据权限范围", help_text="数据权限范围") - dept = models.ManyToManyField(to="Dept",blank=True,null=True,verbose_name="数据权限-关联部门", db_constraint=False, + dept = models.ManyToManyField(to="Dept", blank=True, verbose_name="数据权限-关联部门", db_constraint=False, help_text="数据权限-关联部门") + class Meta: db_table = table_prefix + "role_menu_button_permission" verbose_name = "角色按钮权限表" verbose_name_plural = verbose_name ordering = ("-create_datetime",) + class Dictionary(CoreModel): TYPE_LIST = ( (0, "text"), @@ -262,7 +274,8 @@ class Dictionary(CoreModel): (7, "images"), ) label = models.CharField(max_length=100, blank=True, null=True, verbose_name="字典名称", help_text="字典名称") - value = models.CharField(max_length=200, blank=True, null=True, verbose_name="字典编号", help_text="字典编号/实际值") + value = models.CharField(max_length=200, blank=True, null=True, verbose_name="字典编号", + help_text="字典编号/实际值") parent = models.ForeignKey( to="self", related_name="sublist", @@ -275,7 +288,8 @@ class Dictionary(CoreModel): ) type = models.IntegerField(choices=TYPE_LIST, default=0, verbose_name="数据值类型", help_text="数据值类型") color = models.CharField(max_length=20, blank=True, null=True, verbose_name="颜色", help_text="颜色") - is_value = models.BooleanField(default=False, verbose_name="是否为value值", help_text="是否为value值,用来做具体值存放") + is_value = models.BooleanField(default=False, verbose_name="是否为value值", + help_text="是否为value值,用来做具体值存放") status = models.BooleanField(default=True, verbose_name="状态", help_text="状态") sort = models.IntegerField(default=1, verbose_name="显示排序", null=True, blank=True, help_text="显示排序") remark = models.CharField(max_length=2000, blank=True, null=True, verbose_name="备注", help_text="备注") @@ -297,14 +311,20 @@ class Dictionary(CoreModel): class OperationLog(CoreModel): - request_modular = models.CharField(max_length=64, verbose_name="请求模块", null=True, blank=True, help_text="请求模块") - request_path = models.CharField(max_length=400, verbose_name="请求地址", null=True, blank=True, help_text="请求地址") + request_modular = models.CharField(max_length=64, verbose_name="请求模块", null=True, blank=True, + help_text="请求模块") + request_path = models.CharField(max_length=400, verbose_name="请求地址", null=True, blank=True, + help_text="请求地址") request_body = models.TextField(verbose_name="请求参数", null=True, blank=True, help_text="请求参数") - request_method = models.CharField(max_length=8, verbose_name="请求方式", null=True, blank=True, help_text="请求方式") + request_method = models.CharField(max_length=8, verbose_name="请求方式", null=True, blank=True, + help_text="请求方式") request_msg = models.TextField(verbose_name="操作说明", null=True, blank=True, help_text="操作说明") - request_ip = models.CharField(max_length=32, verbose_name="请求ip地址", null=True, blank=True, help_text="请求ip地址") - request_browser = models.CharField(max_length=64, verbose_name="请求浏览器", null=True, blank=True, help_text="请求浏览器") - response_code = models.CharField(max_length=32, verbose_name="响应状态码", null=True, blank=True, help_text="响应状态码") + request_ip = models.CharField(max_length=32, verbose_name="请求ip地址", null=True, blank=True, + help_text="请求ip地址") + request_browser = models.CharField(max_length=64, verbose_name="请求浏览器", null=True, blank=True, + help_text="请求浏览器") + response_code = models.CharField(max_length=32, verbose_name="响应状态码", null=True, blank=True, + help_text="响应状态码") request_os = models.CharField(max_length=64, verbose_name="操作系统", null=True, blank=True, help_text="操作系统") json_result = models.TextField(verbose_name="返回信息", null=True, blank=True, help_text="返回信息") status = models.BooleanField(default=False, verbose_name="响应状态", help_text="响应状态") @@ -345,7 +365,8 @@ class FileList(CoreModel): class Area(CoreModel): name = models.CharField(max_length=100, verbose_name="名称", help_text="名称") code = models.CharField(max_length=20, verbose_name="地区编码", help_text="地区编码", unique=True, db_index=True) - level = models.BigIntegerField(verbose_name="地区层级(1省份 2城市 3区县 4乡级)", help_text="地区层级(1省份 2城市 3区县 4乡级)") + level = models.BigIntegerField(verbose_name="地区层级(1省份 2城市 3区县 4乡级)", + help_text="地区层级(1省份 2城市 3区县 4乡级)") pinyin = models.CharField(max_length=255, verbose_name="拼音", help_text="拼音") initials = models.CharField(max_length=20, verbose_name="首字母", help_text="首字母") enable = models.BooleanField(default=True, verbose_name="是否启用", help_text="是否启用") @@ -378,8 +399,10 @@ class ApiWhiteList(CoreModel): (2, "PUT"), (3, "DELETE"), ) - method = models.IntegerField(default=0, verbose_name="接口请求方法", null=True, blank=True, help_text="接口请求方法") - enable_datasource = models.BooleanField(default=True, verbose_name="激活数据权限", help_text="激活数据权限", blank=True) + method = models.IntegerField(default=0, verbose_name="接口请求方法", null=True, blank=True, + help_text="接口请求方法") + enable_datasource = models.BooleanField(default=True, verbose_name="激活数据权限", help_text="激活数据权限", + blank=True) class Meta: db_table = table_prefix + "api_white_list" @@ -463,11 +486,13 @@ class LoginLog(CoreModel): district = models.CharField(max_length=50, verbose_name="县区", null=True, blank=True, help_text="县区") isp = models.CharField(max_length=50, verbose_name="运营商", null=True, blank=True, help_text="运营商") area_code = models.CharField(max_length=50, verbose_name="区域代码", null=True, blank=True, help_text="区域代码") - country_english = models.CharField(max_length=50, verbose_name="英文全称", null=True, blank=True, help_text="英文全称") + country_english = models.CharField(max_length=50, verbose_name="英文全称", null=True, blank=True, + help_text="英文全称") country_code = models.CharField(max_length=50, verbose_name="简称", null=True, blank=True, help_text="简称") longitude = models.CharField(max_length=50, verbose_name="经度", null=True, blank=True, help_text="经度") latitude = models.CharField(max_length=50, verbose_name="纬度", null=True, blank=True, help_text="纬度") - login_type = models.IntegerField(default=1, choices=LOGIN_TYPE_CHOICES, verbose_name="登录类型", help_text="登录类型") + login_type = models.IntegerField(default=1, choices=LOGIN_TYPE_CHOICES, verbose_name="登录类型", + help_text="登录类型") class Meta: db_table = table_prefix + "system_login_log" @@ -477,14 +502,16 @@ class LoginLog(CoreModel): class MessageCenter(CoreModel): - title = models.CharField(max_length=100,verbose_name="标题",help_text="标题") - content = models.TextField(verbose_name="内容",help_text="内容") - target_type=models.IntegerField(default=0,verbose_name="目标类型",help_text="目标类型") - target_user = models.ManyToManyField(to=Users,related_name='user',through='MessageCenterTargetUser', through_fields=('messagecenter','users'),blank=True,verbose_name="目标用户",help_text="目标用户") - target_dept = models.ManyToManyField(to=Dept, blank=True, db_constraint=False, - verbose_name="目标部门", help_text="目标部门") - target_role = models.ManyToManyField(to=Role, blank=True, db_constraint=False, - verbose_name="目标角色", help_text="目标角色") + title = models.CharField(max_length=100, verbose_name="标题", help_text="标题") + content = models.TextField(verbose_name="内容", help_text="内容") + target_type = models.IntegerField(default=0, verbose_name="目标类型", help_text="目标类型") + target_user = models.ManyToManyField(to=Users, related_name='user', through='MessageCenterTargetUser', + through_fields=('messagecenter', 'users'), blank=True, verbose_name="目标用户", + help_text="目标用户") + target_dept = models.ManyToManyField(to=Dept, blank=True, db_constraint=False, + verbose_name="目标部门", help_text="目标部门") + target_role = models.ManyToManyField(to=Role, blank=True, db_constraint=False, + verbose_name="目标角色", help_text="目标角色") class Meta: db_table = table_prefix + "message_center" @@ -492,12 +519,15 @@ class MessageCenter(CoreModel): verbose_name_plural = verbose_name ordering = ("-create_datetime",) + class MessageCenterTargetUser(CoreModel): - users = models.ForeignKey(Users,related_name="target_user", on_delete=models.CASCADE,db_constraint=False,verbose_name="关联用户表",help_text="关联用户表") - messagecenter = models.ForeignKey(MessageCenter, on_delete=models.CASCADE,db_constraint=False,verbose_name="关联消息中心表",help_text="关联消息中心表") - is_read = models.BooleanField(default=False,blank=True,null=True,verbose_name="是否已读",help_text="是否已读") + users = models.ForeignKey(Users, related_name="target_user", on_delete=models.CASCADE, db_constraint=False, + verbose_name="关联用户表", help_text="关联用户表") + messagecenter = models.ForeignKey(MessageCenter, on_delete=models.CASCADE, db_constraint=False, + verbose_name="关联消息中心表", help_text="关联消息中心表") + is_read = models.BooleanField(default=False, blank=True, null=True, verbose_name="是否已读", help_text="是否已读") class Meta: db_table = table_prefix + "message_center_target_user" verbose_name = "消息中心目标用户表" - verbose_name_plural = verbose_name \ No newline at end of file + verbose_name_plural = verbose_name diff --git a/backend/dvadmin/system/views/api_white_list.py b/backend/dvadmin/system/views/api_white_list.py index a45f4fc..db1c117 100644 --- a/backend/dvadmin/system/views/api_white_list.py +++ b/backend/dvadmin/system/views/api_white_list.py @@ -22,19 +22,7 @@ class ApiWhiteListSerializer(CustomModelSerializer): read_only_fields = ["id"] -class ApiWhiteListInitSerializer(CustomModelSerializer): - """ - 初始化获取数信息(用于生成初始化json文件) - """ - class Meta: - model = ApiWhiteList - fields = ['url', 'method', 'enable_datasource', 'creator', 'dept_belong_id'] - read_only_fields = ["id"] - extra_kwargs = { - 'creator': {'write_only': True}, - 'dept_belong_id': {'write_only': True} - } class ApiWhiteListViewSet(CustomModelViewSet): diff --git a/backend/dvadmin/system/views/dept.py b/backend/dvadmin/system/views/dept.py index df3cc10..67c5a17 100644 --- a/backend/dvadmin/system/views/dept.py +++ b/backend/dvadmin/system/views/dept.py @@ -55,49 +55,7 @@ class DeptImportSerializer(CustomModelSerializer): read_only_fields = ["id"] -class DeptInitSerializer(CustomModelSerializer): - """ - 递归深度获取数信息(用于生成初始化json文件) - """ - children = serializers.SerializerMethodField() - def get_children(self, obj: Dept): - data = [] - instance = Dept.objects.filter(parent_id=obj.id) - if instance: - serializer = DeptInitSerializer(instance=instance, many=True) - data = serializer.data - return data - - def save(self, **kwargs): - instance = super().save(**kwargs) - children = self.initial_data.get('children') - if children: - for menu_data in children: - menu_data['parent'] = instance.id - filter_data = { - "name": menu_data['name'], - "parent": menu_data['parent'], - "key": menu_data['key'] - } - instance_obj = Dept.objects.filter(**filter_data).first() - if instance_obj and not self.initial_data.get('reset'): - continue - serializer = DeptInitSerializer(instance_obj, data=menu_data, request=self.request) - serializer.is_valid(raise_exception=True) - serializer.save() - - return instance - - class Meta: - model = Dept - fields = ['name', 'sort', 'owner', 'phone', 'email', 'status', 'parent', 'creator', 'dept_belong_id', - 'children', 'key'] - extra_kwargs = { - 'creator': {'write_only': True}, - 'dept_belong_id': {'write_only': True} - } - read_only_fields = ['id', 'children'] class DeptCreateUpdateSerializer(CustomModelSerializer): diff --git a/backend/dvadmin/system/views/dictionary.py b/backend/dvadmin/system/views/dictionary.py index af0fd8b..f299567 100644 --- a/backend/dvadmin/system/views/dictionary.py +++ b/backend/dvadmin/system/views/dictionary.py @@ -27,48 +27,7 @@ class DictionarySerializer(CustomModelSerializer): read_only_fields = ["id"] -class DictionaryInitSerializer(CustomModelSerializer): - """ - 初始化获取数信息(用于生成初始化json文件) - """ - children = serializers.SerializerMethodField() - def get_children(self, obj: Dictionary): - data = [] - instance = Dictionary.objects.filter(parent_id=obj.id) - if instance: - serializer = DictionaryInitSerializer(instance=instance, many=True) - data = serializer.data - return data - - def save(self, **kwargs): - instance = super().save(**kwargs) - children = self.initial_data.get('children') - # 菜单表 - if children: - for data in children: - data['parent'] = instance.id - filter_data = { - "value": data['value'], - "parent": data['parent'] - } - instance_obj = Dictionary.objects.filter(**filter_data).first() - if instance_obj and not self.initial_data.get('reset'): - continue - serializer = DictionaryInitSerializer(instance_obj, data=data, request=self.request) - serializer.is_valid(raise_exception=True) - serializer.save() - return instance - - class Meta: - model = Dictionary - fields = ['label', 'value', 'parent', 'type', 'color', 'is_value', 'status', 'sort', 'remark', 'creator', - 'dept_belong_id', 'children'] - read_only_fields = ["id"] - extra_kwargs = { - 'creator': {'write_only': True}, - 'dept_belong_id': {'write_only': True} - } class DictionaryCreateUpdateSerializer(CustomModelSerializer): diff --git a/backend/dvadmin/system/views/login.py b/backend/dvadmin/system/views/login.py index 732a517..ea084ec 100644 --- a/backend/dvadmin/system/views/login.py +++ b/backend/dvadmin/system/views/login.py @@ -109,7 +109,7 @@ class LoginView(TokenObtainPairView): except: return DetailResponse(msg='该账号未注册') # 获得用户后,校验密码并签发token - if check_password(password,user.password): + if check_password(make_password(password),user.password): return DetailResponse(msg='密码错误') result = { "name":user.name, diff --git a/backend/dvadmin/system/views/menu.py b/backend/dvadmin/system/views/menu.py index 010c24c..e09e5f2 100644 --- a/backend/dvadmin/system/views/menu.py +++ b/backend/dvadmin/system/views/menu.py @@ -10,7 +10,6 @@ from rest_framework import serializers from rest_framework.decorators import action from dvadmin.system.models import Menu, MenuButton, RoleMenuPermission -from dvadmin.system.views.menu_button import MenuButtonInitSerializer from dvadmin.utils.json_response import SuccessResponse from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet @@ -54,72 +53,7 @@ class MenuCreateSerializer(CustomModelSerializer): read_only_fields = ["id"] -class MenuInitSerializer(CustomModelSerializer): - """ - 递归深度获取数信息(用于生成初始化json文件) - """ - name = serializers.CharField(required=False) - children = serializers.SerializerMethodField() - menu_button = serializers.SerializerMethodField() - def get_children(self, obj: Menu): - data = [] - instance = Menu.objects.filter(parent_id=obj.id) - if instance: - serializer = MenuInitSerializer(instance=instance, many=True) - 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'], - } - instance_obj = Menu.objects.filter(**filter_data).first() - if instance_obj and not self.initial_data.get('reset'): - continue - 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', 'is_catalog', 'web_path', 'component', 'component_name', 'status', - 'cache', 'visible', 'parent', 'children', 'menu_button', 'creator', 'dept_belong_id'] - extra_kwargs = { - 'creator': {'write_only': True}, - 'dept_belong_id': {'write_only': True} - } - read_only_fields = ['id', 'children'] class WebRouterSerializer(CustomModelSerializer): diff --git a/backend/dvadmin/system/views/menu_button.py b/backend/dvadmin/system/views/menu_button.py index f8a6743..74e38a6 100644 --- a/backend/dvadmin/system/views/menu_button.py +++ b/backend/dvadmin/system/views/menu_button.py @@ -27,15 +27,7 @@ class MenuButtonSerializer(CustomModelSerializer): read_only_fields = ["id"] -class MenuButtonInitSerializer(CustomModelSerializer): - """ - 初始化菜单按钮-序列化器 - """ - class Meta: - model = MenuButton - fields = ['id', 'name', 'value', 'api', 'method', 'menu'] - read_only_fields = ["id"] class MenuButtonCreateUpdateSerializer(CustomModelSerializer): """ diff --git a/backend/dvadmin/system/views/role.py b/backend/dvadmin/system/views/role.py index f6fa40e..903ab01 100644 --- a/backend/dvadmin/system/views/role.py +++ b/backend/dvadmin/system/views/role.py @@ -31,20 +31,7 @@ class RoleSerializer(CustomModelSerializer): read_only_fields = ["id"] -class RoleInitSerializer(CustomModelSerializer): - """ - 初始化获取数信息(用于生成初始化json文件) - """ - class Meta: - model = Role - fields = ['name', 'key', 'sort', 'status', 'admin', - 'creator', 'dept_belong_id'] - read_only_fields = ["id"] - extra_kwargs = { - 'creator': {'write_only': True}, - 'dept_belong_id': {'write_only': True} - } class RoleCreateUpdateSerializer(CustomModelSerializer): diff --git a/backend/dvadmin/system/views/system_config.py b/backend/dvadmin/system/views/system_config.py index cd664d3..f299b16 100644 --- a/backend/dvadmin/system/views/system_config.py +++ b/backend/dvadmin/system/views/system_config.py @@ -43,48 +43,6 @@ class SystemConfigCreateSerializer(CustomModelSerializer): return value -class SystemConfigInitSerializer(CustomModelSerializer): - """ - 初始化获取数信息(用于生成初始化json文件) - """ - children = serializers.SerializerMethodField() - - def get_children(self, obj: SystemConfig): - data = [] - instance = SystemConfig.objects.filter(parent_id=obj.id) - if instance: - serializer = SystemConfigInitSerializer(instance=instance, many=True) - data = serializer.data - return data - - def save(self, **kwargs): - instance = super().save(**kwargs) - children = self.initial_data.get('children') - # 菜单表 - if children: - for data in children: - data['parent'] = instance.id - filter_data = { - "key": data['key'], - "parent": data['parent'] - } - instance_obj = SystemConfig.objects.filter(**filter_data).first() - if instance_obj and not self.initial_data.get('reset'): - continue - serializer = SystemConfigInitSerializer(instance_obj, data=data, request=self.request) - serializer.is_valid(raise_exception=True) - serializer.save() - return instance - - class Meta: - model = SystemConfig - fields = ['parent', 'title', 'key', 'value', 'sort', 'status', 'data_options', 'form_item_type', 'rule', - 'placeholder', 'setting', 'creator', 'dept_belong_id', 'children'] - read_only_fields = ["id"] - extra_kwargs = { - 'creator': {'write_only': True}, - 'dept_belong_id': {'write_only': True} - } class SystemConfigSerializer(CustomModelSerializer): diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py index 046c2b6..5ac9c34 100644 --- a/backend/dvadmin/system/views/user.py +++ b/backend/dvadmin/system/views/user.py @@ -60,32 +60,7 @@ class UserSerializer(CustomModelSerializer): return serializer.data -class UsersInitSerializer(CustomModelSerializer): - """ - 初始化获取数信息(用于生成初始化json文件) - """ - def save(self, **kwargs): - instance = super().save(**kwargs) - role_key = self.initial_data.get('role_key', []) - role_ids = Role.objects.filter(key__in=role_key).values_list('id', flat=True) - instance.role.set(role_ids) - dept_key = self.initial_data.get('dept_key', None) - dept_id = Dept.objects.filter(key=dept_key).first() - instance.dept = dept_id - instance.save() - return instance - - class Meta: - model = Users - fields = ["username", "email", 'mobile', 'avatar', "name", 'gender', 'user_type', "dept", 'user_type', - 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'creator', 'dept_belong_id', - 'password', 'last_login', 'is_superuser'] - read_only_fields = ['id'] - extra_kwargs = { - 'creator': {'write_only': True}, - 'dept_belong_id': {'write_only': True} - } class UserCreateSerializer(CustomModelSerializer): diff --git a/backend/dvadmin/utils/core_initialize.py b/backend/dvadmin/utils/core_initialize.py index 2ae62cb..3fddf42 100644 --- a/backend/dvadmin/utils/core_initialize.py +++ b/backend/dvadmin/utils/core_initialize.py @@ -33,6 +33,7 @@ class CoreInitialize: path_file = os.path.join(apps.get_app_config(self.app.split('.')[-1]).path, 'fixtures', f'init_{Serializer.Meta.model._meta.model_name}.json') if not os.path.isfile(path_file): + print("文件不存在,跳过初始化") return with open(path_file,encoding="utf-8") as f: for data in json.load(f):