功能变化: 重构初始化功能

This commit is contained in:
猿小天
2023-02-20 22:59:49 +08:00
parent 97e3ca72be
commit 7f0ffffafc
17 changed files with 514 additions and 362 deletions

View File

@@ -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}
}

View File

@@ -30,31 +30,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "menu:Search",
"api": "/api/system/menu/", "api": "/api/system/menu/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "menu:Retrieve",
"api": "/api/system/menu/{id}/", "api": "/api/system/menu/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "menu:Create",
"api": "/api/system/menu/", "api": "/api/system/menu/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "menu:Update",
"api": "/api/system/menu/{id}/", "api": "/api/system/menu/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "menu:Delete",
"api": "/api/system/menu/{id}/", "api": "/api/system/menu/{id}/",
"method": 3 "method": 3
} }
@@ -77,25 +77,25 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "menu_button:Search",
"api": "/api/system/menu_button/", "api": "/api/system/menu_button/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "menu_button:Create",
"api": "/api/system/menu_button/", "api": "/api/system/menu_button/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "menu_button:Update",
"api": "/api/system/menu_button/{id}/", "api": "/api/system/menu_button/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "menu_button:Delete",
"api": "/api/system/menu_button/{id}/", "api": "/api/system/menu_button/{id}/",
"method": 3 "method": 3
} }
@@ -118,31 +118,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "dept:Search",
"api": "/api/system/dept/", "api": "/api/system/dept/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "dept:Retrieve",
"api": "/api/system/dept/{id}/", "api": "/api/system/dept/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "dept:Create",
"api": "/api/system/dept/", "api": "/api/system/dept/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "dept:Update",
"api": "/api/system/dept/{id}/", "api": "/api/system/dept/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "dept:Delete",
"api": "/api/system/dept/{id}/", "api": "/api/system/dept/{id}/",
"method": 3 "method": 3
} }
@@ -165,37 +165,37 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "role:Search",
"api": "/api/system/role/", "api": "/api/system/role/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "role:Retrieve",
"api": "/api/system/role/{id}/", "api": "/api/system/role/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "role:Create",
"api": "/api/system/role/", "api": "/api/system/role/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "role:Update",
"api": "/api/system/role/{id}/", "api": "/api/system/role/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "保存", "name": "保存",
"value": "Save", "value": "role:Save",
"api": "/api/system/role/{id}/", "api": "/api/system/role/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "role:Delete",
"api": "/api/system/role/{id}/", "api": "/api/system/role/{id}/",
"method": 3 "method": 3
} }
@@ -218,55 +218,55 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "user:Search",
"api": "/api/system/user/", "api": "/api/system/user/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "user:Retrieve",
"api": "/api/system/user/{id}/", "api": "/api/system/user/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "user:Create",
"api": "/api/system/user/", "api": "/api/system/user/",
"method": 1 "method": 1
}, },
{ {
"name": "导出", "name": "导出",
"value": "Export", "value": "user:Export",
"api": "/api/system/user/export/", "api": "/api/system/user/export/",
"method": 1 "method": 1
}, },
{ {
"name": "导入", "name": "导入",
"value": "Import", "value": "user:Import",
"api": "/api/system/user/import/", "api": "/api/system/user/import/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "user:Update",
"api": "/api/system/user/{id}/", "api": "/api/system/user/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "重设密码", "name": "重设密码",
"value": "ResetPassword", "value": "user:ResetPassword",
"api": "/api/system/user/{id}/reset_password/", "api": "/api/system/user/{id}/reset_password/",
"method": 2 "method": 2
}, },
{ {
"name": "重置密码", "name": "重置密码",
"value": "DefaultPassword", "value": "user:DefaultPassword",
"api": "/api/system/user/{id}/reset_to_default_password/", "api": "/api/system/user/{id}/reset_to_default_password/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "user:Delete",
"api": "/api/system/user/{id}/", "api": "/api/system/user/{id}/",
"method": 3 "method": 3
} }
@@ -289,31 +289,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "menu:Search",
"api": "/api/system/message_center/", "api": "/api/system/message_center/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "menu:Retrieve",
"api": "/api/system/message_center/{id}/", "api": "/api/system/message_center/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "menu:Create",
"api": "/api/system/message_center/", "api": "/api/system/message_center/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "menu:Update",
"api": "/api/system/message_center/{id}/", "api": "/api/system/message_center/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "menu:Delete",
"api": "/api/system/menu/{id}/", "api": "/api/system/menu/{id}/",
"method": 3 "method": 3
} }
@@ -336,31 +336,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "api_white_list:Search",
"api": "/api/system/api_white_list/", "api": "/api/system/api_white_list/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "api_white_list:Retrieve",
"api": "/api/system/api_white_list/{id}/", "api": "/api/system/api_white_list/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "api_white_list:Create",
"api": "/api/system/api_white_list/", "api": "/api/system/api_white_list/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "api_white_list:Update",
"api": "/api/system/api_white_list/{id}/", "api": "/api/system/api_white_list/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "api_white_list:Delete",
"api": "/api/system/api_white_list/{id}/", "api": "/api/system/api_white_list/{id}/",
"method": 3 "method": 3
} }
@@ -400,31 +400,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "system_config:Search",
"api": "/api/system/system_config/", "api": "/api/system/system_config/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "system_config:Retrieve",
"api": "/api/system/system_config/{id}/", "api": "/api/system/system_config/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "system_config:Create",
"api": "/api/system/system_config/", "api": "/api/system/system_config/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "system_config:Update",
"api": "/api/system/system_config/{id}/", "api": "/api/system/system_config/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "system_config:Delete",
"api": "/api/system/system_config/{id}/", "api": "/api/system/system_config/{id}/",
"method": 3 "method": 3
} }
@@ -447,31 +447,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "dictionary:Search",
"api": "/api/system/dictionary/", "api": "/api/system/dictionary/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "dictionary:Retrieve",
"api": "/api/system/dictionary/{id}/", "api": "/api/system/dictionary/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "dictionary:Create",
"api": "/api/system/dictionary/", "api": "/api/system/dictionary/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "dictionary:Update",
"api": "/api/system/dictionary/{id}/", "api": "/api/system/dictionary/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "dictionary:Delete",
"api": "/api/system/dictionary/{id}/", "api": "/api/system/dictionary/{id}/",
"method": 3 "method": 3
} }
@@ -494,31 +494,31 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "area:Search",
"api": "/api/system/area/", "api": "/api/system/area/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "area:Retrieve",
"api": "/api/system/area/{id}/", "api": "/api/system/area/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "新增", "name": "新增",
"value": "Create", "value": "area:Create",
"api": "/api/system/area/", "api": "/api/system/area/",
"method": 1 "method": 1
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "area:Update",
"api": "/api/system/area/{id}/", "api": "/api/system/area/{id}/",
"method": 2 "method": 2
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "area:Delete",
"api": "/api/system/area/{id}/", "api": "/api/system/area/{id}/",
"method": 3 "method": 3
} }
@@ -541,25 +541,25 @@
"menu_button": [ "menu_button": [
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "file:Retrieve",
"api": "/api/system/file/{id}/", "api": "/api/system/file/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "file:Search",
"api": "/api/system/file/", "api": "/api/system/file/",
"method": 0 "method": 0
}, },
{ {
"name": "编辑", "name": "编辑",
"value": "Update", "value": "file:Update",
"api": "/api/system/file/{id}/", "api": "/api/system/file/{id}/",
"method": 1 "method": 1
}, },
{ {
"name": "删除", "name": "删除",
"value": "Delete", "value": "file:Delete",
"api": "/api/system/file/{id}/", "api": "/api/system/file/{id}/",
"method": 3 "method": 3
} }
@@ -599,13 +599,13 @@
"menu_button": [ "menu_button": [
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "login_log:Search",
"api": "/api/system/login_log/", "api": "/api/system/login_log/",
"method": 0 "method": 0
}, },
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "login_log:Retrieve",
"api": "/api/system/login_log/{id}/", "api": "/api/system/login_log/{id}/",
"method": 0 "method": 0
} }
@@ -628,13 +628,13 @@
"menu_button": [ "menu_button": [
{ {
"name": "详情", "name": "详情",
"value": "Retrieve", "value": "operation_log:Retrieve",
"api": "/api/system/operation_log/{id}/", "api": "/api/system/operation_log/{id}/",
"method": 0 "method": 0
}, },
{ {
"name": "查询", "name": "查询",
"value": "Search", "value": "operation_log:Search",
"api": "/api/system/operation_log/", "api": "/api/system/operation_log/",
"method": 0 "method": 0
} }

View File

@@ -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
}
]

View File

@@ -0,0 +1,10 @@
[
{
"role_key": "admin",
"menu_component_name": "menu"
},
{
"role_key": "public",
"menu_component_name": "menu"
}
]

View File

@@ -3,17 +3,14 @@ import os
import django import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "application.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "application.settings")
django.setup() 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.utils.core_initialize import CoreInitialize
from dvadmin.system.views.role import RoleInitSerializer from dvadmin.system.fixtures.initSerializer import UsersInitSerializer, DeptInitSerializer, RoleInitSerializer, \
from dvadmin.system.views.api_white_list import ApiWhiteListInitSerializer MenuInitSerializer, ApiWhiteListInitSerializer, DictionaryInitSerializer, SystemConfigInitSerializer, \
from dvadmin.system.views.dept import DeptInitSerializer RoleMenuInitSerializer, RoleMenuButtonInitSerializer
from dvadmin.system.views.dictionary import DictionaryInitSerializer
from dvadmin.system.views.system_config import SystemConfigInitSerializer
class Initialize(CoreInitialize): class Initialize(CoreInitialize):
@@ -42,6 +39,19 @@ class Initialize(CoreInitialize):
""" """
self.init_base(MenuInitSerializer, unique_fields=['name', 'web_path', 'component', 'component_name']) 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): def init_api_white_list(self):
""" """
初始API白名单 初始API白名单
@@ -65,6 +75,8 @@ class Initialize(CoreInitialize):
self.init_role() self.init_role()
self.init_users() self.init_users()
self.init_menu() self.init_menu()
self.init_role_menu()
self.init_role_menu_button()
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

@@ -5,20 +5,15 @@ import os
import django import django
from django.db.models import QuerySet from django.db.models import QuerySet
from dvadmin.system.views.system_config import SystemConfigInitSerializer
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
django.setup() django.setup()
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from application.settings import BASE_DIR from application.settings import BASE_DIR
from dvadmin.system.models import Menu, Users, Dept, Role, ApiWhiteList, Dictionary, SystemConfig from dvadmin.system.models import Menu, Users, Dept, Role, ApiWhiteList, Dictionary, SystemConfig
from dvadmin.system.views.api_white_list import ApiWhiteListInitSerializer from dvadmin.system.fixtures.initSerializer import UsersInitSerializer, DeptInitSerializer, RoleInitSerializer, \
from dvadmin.system.views.dept import DeptInitSerializer MenuInitSerializer, ApiWhiteListInitSerializer, DictionaryInitSerializer, SystemConfigInitSerializer, \
from dvadmin.system.views.dictionary import DictionaryInitSerializer RoleMenuInitSerializer, RoleMenuButtonInitSerializer
from dvadmin.system.views.menu import MenuInitSerializer
from dvadmin.system.views.role import RoleInitSerializer
from dvadmin.system.views.user import UsersInitSerializer
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@@ -13,8 +13,9 @@ STATUS_CHOICES = (
) )
class Users(CoreModel,AbstractUser): class Users(CoreModel, AbstractUser):
username = models.CharField(max_length=150, unique=True, db_index=True, verbose_name="用户账号", help_text="用户账号") 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="邮箱") 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="电话") 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="头像") 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( user_type = models.IntegerField(
choices=USER_TYPE, default=0, verbose_name="用户类型", null=True, blank=True, help_text="用户类型" 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="关联岗位") post = models.ManyToManyField(to="Post", blank=True, verbose_name="关联岗位", db_constraint=False,
role = models.ManyToManyField(to="Role", blank=True,verbose_name="关联角色", db_constraint=False, help_text="关联角色") help_text="关联岗位")
role = models.ManyToManyField(to="Role", blank=True, verbose_name="关联角色", db_constraint=False,
help_text="关联角色")
dept = models.ForeignKey( dept = models.ForeignKey(
to="Dept", to="Dept",
verbose_name="所属部门", verbose_name="所属部门",
@@ -89,7 +92,8 @@ class Role(CoreModel):
class Dept(CoreModel): class Dept(CoreModel):
name = models.CharField(max_length=64, verbose_name="部门名称", help_text="部门名称") 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="显示排序") sort = models.IntegerField(default=1, verbose_name="显示排序", help_text="显示排序")
owner = models.CharField(max_length=32, verbose_name="负责人", null=True, blank=True, 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="联系电话") 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="是否目录") 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="路由地址") 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 = 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="菜单状态") status = models.BooleanField(default=True, blank=True, verbose_name="菜单状态", help_text="菜单状态")
cache = models.BooleanField(default=False, 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: class Meta:
db_table = table_prefix + "system_menu" db_table = table_prefix + "system_menu"
@@ -175,7 +181,7 @@ class MenuButton(CoreModel):
help_text="关联菜单", help_text="关联菜单",
) )
name = models.CharField(max_length=64, verbose_name="名称", 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="接口地址") api = models.CharField(max_length=200, verbose_name="接口地址", help_text="接口地址")
METHOD_CHOICES = ( METHOD_CHOICES = (
(0, "GET"), (0, "GET"),
@@ -183,7 +189,8 @@ class MenuButton(CoreModel):
(2, "PUT"), (2, "PUT"),
(3, "DELETE"), (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: class Meta:
db_table = table_prefix + "system_menu_button" db_table = table_prefix + "system_menu_button"
@@ -191,6 +198,7 @@ class MenuButton(CoreModel):
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
ordering = ("-name",) ordering = ("-name",)
class RoleMenuPermission(CoreModel): class RoleMenuPermission(CoreModel):
role = models.ForeignKey( role = models.ForeignKey(
to="Role", to="Role",
@@ -208,12 +216,14 @@ class RoleMenuPermission(CoreModel):
verbose_name="关联菜单", verbose_name="关联菜单",
help_text="关联菜单", help_text="关联菜单",
) )
class Meta: class Meta:
db_table = table_prefix + "role_menu_permission" db_table = table_prefix + "role_menu_permission"
verbose_name = "角色菜单权限表" verbose_name = "角色菜单权限表"
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
ordering = ("-create_datetime",) ordering = ("-create_datetime",)
class RoleMenuButtonPermission(CoreModel): class RoleMenuButtonPermission(CoreModel):
role = models.ForeignKey( role = models.ForeignKey(
to="Role", to="Role",
@@ -242,14 +252,16 @@ class RoleMenuButtonPermission(CoreModel):
) )
data_range = models.IntegerField(default=0, choices=DATASCOPE_CHOICES, verbose_name="数据权限范围", data_range = models.IntegerField(default=0, choices=DATASCOPE_CHOICES, verbose_name="数据权限范围",
help_text="数据权限范围") 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="数据权限-关联部门") help_text="数据权限-关联部门")
class Meta: class Meta:
db_table = table_prefix + "role_menu_button_permission" db_table = table_prefix + "role_menu_button_permission"
verbose_name = "角色按钮权限表" verbose_name = "角色按钮权限表"
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
ordering = ("-create_datetime",) ordering = ("-create_datetime",)
class Dictionary(CoreModel): class Dictionary(CoreModel):
TYPE_LIST = ( TYPE_LIST = (
(0, "text"), (0, "text"),
@@ -262,7 +274,8 @@ class Dictionary(CoreModel):
(7, "images"), (7, "images"),
) )
label = models.CharField(max_length=100, blank=True, null=True, verbose_name="字典名称", help_text="字典名称") 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( parent = models.ForeignKey(
to="self", to="self",
related_name="sublist", related_name="sublist",
@@ -275,7 +288,8 @@ class Dictionary(CoreModel):
) )
type = models.IntegerField(choices=TYPE_LIST, default=0, verbose_name="数据值类型", help_text="数据值类型") 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="颜色") 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="状态") status = models.BooleanField(default=True, verbose_name="状态", help_text="状态")
sort = models.IntegerField(default=1, verbose_name="显示排序", null=True, blank=True, 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="备注") remark = models.CharField(max_length=2000, blank=True, null=True, verbose_name="备注", help_text="备注")
@@ -297,14 +311,20 @@ class Dictionary(CoreModel):
class OperationLog(CoreModel): class OperationLog(CoreModel):
request_modular = models.CharField(max_length=64, verbose_name="请求模块", null=True, blank=True, help_text="请求模块") request_modular = models.CharField(max_length=64, verbose_name="请求模块", null=True, blank=True,
request_path = models.CharField(max_length=400, verbose_name="请求地址", null=True, blank=True, help_text="请求地址") 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_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_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_ip = models.CharField(max_length=32, verbose_name="请求ip地址", null=True, blank=True,
request_browser = models.CharField(max_length=64, verbose_name="请求浏览器", null=True, blank=True, help_text="请求浏览器") help_text="请求ip地址")
response_code = models.CharField(max_length=32, verbose_name="响应状态码", null=True, blank=True, help_text="响应状态码") 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="操作系统") 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="返回信息") json_result = models.TextField(verbose_name="返回信息", null=True, blank=True, help_text="返回信息")
status = models.BooleanField(default=False, verbose_name="响应状态", help_text="响应状态") status = models.BooleanField(default=False, verbose_name="响应状态", help_text="响应状态")
@@ -345,7 +365,8 @@ class FileList(CoreModel):
class Area(CoreModel): class Area(CoreModel):
name = models.CharField(max_length=100, verbose_name="名称", help_text="名称") 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) 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="拼音") pinyin = models.CharField(max_length=255, verbose_name="拼音", help_text="拼音")
initials = models.CharField(max_length=20, verbose_name="首字母", help_text="首字母") initials = models.CharField(max_length=20, verbose_name="首字母", help_text="首字母")
enable = models.BooleanField(default=True, verbose_name="是否启用", help_text="是否启用") enable = models.BooleanField(default=True, verbose_name="是否启用", help_text="是否启用")
@@ -378,8 +399,10 @@ class ApiWhiteList(CoreModel):
(2, "PUT"), (2, "PUT"),
(3, "DELETE"), (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,
enable_datasource = models.BooleanField(default=True, verbose_name="激活数据权限", help_text="激活数据权限", blank=True) help_text="接口请求方法")
enable_datasource = models.BooleanField(default=True, verbose_name="激活数据权限", help_text="激活数据权限",
blank=True)
class Meta: class Meta:
db_table = table_prefix + "api_white_list" 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="县区") 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="运营商") 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="区域代码") 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="简称") 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="经度") 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="纬度") 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: class Meta:
db_table = table_prefix + "system_login_log" db_table = table_prefix + "system_login_log"
@@ -477,14 +502,16 @@ class LoginLog(CoreModel):
class MessageCenter(CoreModel): class MessageCenter(CoreModel):
title = models.CharField(max_length=100,verbose_name="标题",help_text="标题") title = models.CharField(max_length=100, verbose_name="标题", help_text="标题")
content = models.TextField(verbose_name="内容",help_text="内容") content = models.TextField(verbose_name="内容", help_text="内容")
target_type=models.IntegerField(default=0,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_user = models.ManyToManyField(to=Users, related_name='user', through='MessageCenterTargetUser',
target_dept = models.ManyToManyField(to=Dept, blank=True, db_constraint=False, through_fields=('messagecenter', 'users'), blank=True, verbose_name="目标用户",
verbose_name="目标部门", help_text="目标部门") help_text="目标用户")
target_role = models.ManyToManyField(to=Role, blank=True, db_constraint=False, target_dept = models.ManyToManyField(to=Dept, blank=True, db_constraint=False,
verbose_name="目标角色", help_text="目标角色") verbose_name="目标部门", help_text="目标部门")
target_role = models.ManyToManyField(to=Role, blank=True, db_constraint=False,
verbose_name="目标角色", help_text="目标角色")
class Meta: class Meta:
db_table = table_prefix + "message_center" db_table = table_prefix + "message_center"
@@ -492,10 +519,13 @@ class MessageCenter(CoreModel):
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
ordering = ("-create_datetime",) ordering = ("-create_datetime",)
class MessageCenterTargetUser(CoreModel): class MessageCenterTargetUser(CoreModel):
users = models.ForeignKey(Users,related_name="target_user", on_delete=models.CASCADE,db_constraint=False,verbose_name="关联用户表",help_text="关联用户表") users = models.ForeignKey(Users, related_name="target_user", on_delete=models.CASCADE, db_constraint=False,
messagecenter = models.ForeignKey(MessageCenter, on_delete=models.CASCADE,db_constraint=False,verbose_name="关联消息中心",help_text="关联消息中心") verbose_name="关联用户", help_text="关联用户")
is_read = models.BooleanField(default=False,blank=True,null=True,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: class Meta:
db_table = table_prefix + "message_center_target_user" db_table = table_prefix + "message_center_target_user"

View File

@@ -22,19 +22,7 @@ class ApiWhiteListSerializer(CustomModelSerializer):
read_only_fields = ["id"] 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): class ApiWhiteListViewSet(CustomModelViewSet):

View File

@@ -55,49 +55,7 @@ class DeptImportSerializer(CustomModelSerializer):
read_only_fields = ["id"] 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): class DeptCreateUpdateSerializer(CustomModelSerializer):

View File

@@ -27,48 +27,7 @@ class DictionarySerializer(CustomModelSerializer):
read_only_fields = ["id"] 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): class DictionaryCreateUpdateSerializer(CustomModelSerializer):

View File

@@ -109,7 +109,7 @@ class LoginView(TokenObtainPairView):
except: except:
return DetailResponse(msg='该账号未注册') return DetailResponse(msg='该账号未注册')
# 获得用户后校验密码并签发token # 获得用户后校验密码并签发token
if check_password(password,user.password): if check_password(make_password(password),user.password):
return DetailResponse(msg='密码错误') return DetailResponse(msg='密码错误')
result = { result = {
"name":user.name, "name":user.name,

View File

@@ -10,7 +10,6 @@ from rest_framework import serializers
from rest_framework.decorators import action from rest_framework.decorators import action
from dvadmin.system.models import Menu, MenuButton, RoleMenuPermission 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.json_response import SuccessResponse
from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.serializers import CustomModelSerializer
from dvadmin.utils.viewset import CustomModelViewSet from dvadmin.utils.viewset import CustomModelViewSet
@@ -54,72 +53,7 @@ class MenuCreateSerializer(CustomModelSerializer):
read_only_fields = ["id"] 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): class WebRouterSerializer(CustomModelSerializer):

View File

@@ -27,15 +27,7 @@ class MenuButtonSerializer(CustomModelSerializer):
read_only_fields = ["id"] 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): class MenuButtonCreateUpdateSerializer(CustomModelSerializer):
""" """

View File

@@ -31,20 +31,7 @@ class RoleSerializer(CustomModelSerializer):
read_only_fields = ["id"] 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): class RoleCreateUpdateSerializer(CustomModelSerializer):

View File

@@ -43,48 +43,6 @@ class SystemConfigCreateSerializer(CustomModelSerializer):
return value 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): class SystemConfigSerializer(CustomModelSerializer):

View File

@@ -60,32 +60,7 @@ class UserSerializer(CustomModelSerializer):
return serializer.data 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): class UserCreateSerializer(CustomModelSerializer):

View File

@@ -33,6 +33,7 @@ class CoreInitialize:
path_file = os.path.join(apps.get_app_config(self.app.split('.')[-1]).path, 'fixtures', path_file = os.path.join(apps.get_app_config(self.app.split('.')[-1]).path, 'fixtures',
f'init_{Serializer.Meta.model._meta.model_name}.json') f'init_{Serializer.Meta.model._meta.model_name}.json')
if not os.path.isfile(path_file): if not os.path.isfile(path_file):
print("文件不存在,跳过初始化")
return return
with open(path_file,encoding="utf-8") as f: with open(path_file,encoding="utf-8") as f:
for data in json.load(f): for data in json.load(f):