功能变化: 重构初始化功能
This commit is contained in:
341
backend/dvadmin/system/fixtures/initSerializer.py
Normal file
341
backend/dvadmin/system/fixtures/initSerializer.py
Normal 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}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
10
backend/dvadmin/system/fixtures/init_rolemenupermission.json
Normal file
10
backend/dvadmin/system/fixtures/init_rolemenupermission.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"role_key": "admin",
|
||||||
|
"menu_component_name": "menu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role_key": "public",
|
||||||
|
"menu_component_name": "menu"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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__)
|
||||||
|
|
||||||
|
|||||||
@@ -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,12 +519,15 @@ 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"
|
||||||
verbose_name = "消息中心目标用户表"
|
verbose_name = "消息中心目标用户表"
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user