refactor(initialize data): bug fixed & refactor initialize script
parent
0ca351c7ba
commit
c89148f681
File diff suppressed because it is too large
Load Diff
|
@ -13,27 +13,33 @@ class Command(BaseCommand):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
parser.add_argument('init_name', nargs='*', type=str, )
|
parser.add_argument(
|
||||||
parser.add_argument('-y', nargs='*')
|
"init_name",
|
||||||
parser.add_argument('-Y', nargs='*')
|
nargs="*",
|
||||||
parser.add_argument('-n', nargs='*')
|
type=str,
|
||||||
parser.add_argument('-N', nargs='*')
|
)
|
||||||
|
parser.add_argument("-y", nargs="*")
|
||||||
|
parser.add_argument("-Y", nargs="*")
|
||||||
|
parser.add_argument("-n", nargs="*")
|
||||||
|
parser.add_argument("-N", nargs="*")
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
reset = False
|
reset = False
|
||||||
if isinstance(options.get('y'), list) or isinstance(options.get('Y'), list):
|
if isinstance(options.get("y"), list) or isinstance(options.get("Y"), list):
|
||||||
reset = True
|
reset = True
|
||||||
if isinstance(options.get('n'), list) or isinstance(options.get('N'), list):
|
if isinstance(options.get("n"), list) or isinstance(options.get("N"), list):
|
||||||
reset = False
|
reset = False
|
||||||
print(f"正在准备初始化数据,{'如有初始化数据,将会不做操作跳过' if not reset else '初始数据将会先删除后新增'}...")
|
print(f"正在准备初始化数据,{'如有初始化数据,将会不做操作跳过' if not reset else '初始数据将会先删除后新增'}...")
|
||||||
|
|
||||||
for app in settings.INSTALLED_APPS:
|
for app in settings.INSTALLED_APPS:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
exec(f"""
|
exec(
|
||||||
from {app}.initialize import main
|
f"""
|
||||||
|
from {app}.util.initialize import main
|
||||||
main(reset={reset})
|
main(reset={reset})
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
pass
|
pass
|
||||||
print("初始化数据完成!")
|
print("初始化数据完成!")
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,91 @@
|
||||||
|
# 初始化
|
||||||
|
import os
|
||||||
|
|
||||||
|
import django
|
||||||
|
|
||||||
|
from dvadmin.utils.core_initialize import CoreInitialize
|
||||||
|
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "application.settings")
|
||||||
|
django.setup()
|
||||||
|
|
||||||
|
from dvadmin.system.models import (
|
||||||
|
Dept,
|
||||||
|
Button,
|
||||||
|
Menu,
|
||||||
|
MenuButton,
|
||||||
|
Role,
|
||||||
|
Users,
|
||||||
|
Dictionary,
|
||||||
|
)
|
||||||
|
|
||||||
|
from .init_data import (
|
||||||
|
dept_data,
|
||||||
|
button_data,
|
||||||
|
menu_data,
|
||||||
|
menu_button_data,
|
||||||
|
role_data,
|
||||||
|
staff_data,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Initialize(CoreInitialize):
|
||||||
|
creator_id = 1
|
||||||
|
|
||||||
|
def init_dept(self):
|
||||||
|
"""
|
||||||
|
初始化部门信息
|
||||||
|
"""
|
||||||
|
self.dept_data = dept_data
|
||||||
|
self.save(Dept, self.dept_data, "部门信息")
|
||||||
|
|
||||||
|
def init_button(self):
|
||||||
|
"""
|
||||||
|
初始化按钮表
|
||||||
|
"""
|
||||||
|
self.button_data = button_data
|
||||||
|
self.save(Button, self.button_data, "权限表标识")
|
||||||
|
|
||||||
|
def init_menu(self):
|
||||||
|
"""
|
||||||
|
初始化菜单表
|
||||||
|
"""
|
||||||
|
self.menu_data = menu_data
|
||||||
|
self.save(Menu, self.menu_data, "菜单表")
|
||||||
|
|
||||||
|
def init_menu_button(self):
|
||||||
|
"""
|
||||||
|
初始化菜单按钮表
|
||||||
|
"""
|
||||||
|
self.menu_button_data = menu_button_data
|
||||||
|
self.save(MenuButton, self.menu_button_data, "菜单权限表")
|
||||||
|
|
||||||
|
def init_role(self):
|
||||||
|
"""
|
||||||
|
初始化角色表
|
||||||
|
"""
|
||||||
|
data = role_data
|
||||||
|
self.save(Role, data, "角色表")
|
||||||
|
|
||||||
|
def init_users(self):
|
||||||
|
"""
|
||||||
|
初始化用户表
|
||||||
|
"""
|
||||||
|
data = staff_data
|
||||||
|
self.save(Users, data, "用户表", no_reset=False)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.init_dept()
|
||||||
|
self.init_button()
|
||||||
|
self.init_menu()
|
||||||
|
self.init_menu_button()
|
||||||
|
self.init_role()
|
||||||
|
self.init_users()
|
||||||
|
|
||||||
|
|
||||||
|
# 项目init 初始化,默认会执行 main 方法进行初始化
|
||||||
|
def main(reset=False):
|
||||||
|
Initialize(reset).run()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -17,37 +17,46 @@ from dvadmin.system.models import Users
|
||||||
from django_restql.mixins import DynamicFieldsMixin
|
from django_restql.mixins import DynamicFieldsMixin
|
||||||
|
|
||||||
|
|
||||||
|
class CustomModelSerializer(DynamicFieldsMixin, ModelSerializer):
|
||||||
class CustomModelSerializer(DynamicFieldsMixin,ModelSerializer):
|
|
||||||
"""
|
"""
|
||||||
增强DRF的ModelSerializer,可自动更新模型的审计字段记录
|
增强DRF的ModelSerializer,可自动更新模型的审计字段记录
|
||||||
(1)self.request能获取到rest_framework.request.Request对象
|
(1)self.request能获取到rest_framework.request.Request对象
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 修改人的审计字段名称, 默认modifier, 继承使用时可自定义覆盖
|
# 修改人的审计字段名称, 默认modifier, 继承使用时可自定义覆盖
|
||||||
modifier_field_id = 'modifier'
|
modifier_field_id = "modifier"
|
||||||
modifier_name = serializers.SerializerMethodField(read_only=True)
|
modifier_name = serializers.SerializerMethodField(read_only=True)
|
||||||
|
|
||||||
def get_modifier_name(self, instance):
|
def get_modifier_name(self, instance):
|
||||||
if not hasattr(instance, 'modifier'):
|
if not hasattr(instance, "modifier"):
|
||||||
return None
|
return None
|
||||||
queryset = Users.objects.filter(username=instance.modifier).values_list('name', flat=True).first()
|
queryset = (
|
||||||
|
Users.objects.filter(id=instance.modifier)
|
||||||
|
.values_list("name", flat=True)
|
||||||
|
.first()
|
||||||
|
)
|
||||||
if queryset:
|
if queryset:
|
||||||
return queryset
|
return queryset
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# 创建人的审计字段名称, 默认creator, 继承使用时可自定义覆盖
|
# 创建人的审计字段名称, 默认creator, 继承使用时可自定义覆盖
|
||||||
creator_field_id = 'creator'
|
creator_field_id = "creator"
|
||||||
creator_name = serializers.SlugRelatedField(slug_field="name", source="creator", read_only=True)
|
creator_name = serializers.SlugRelatedField(
|
||||||
|
slug_field="name", source="creator", read_only=True
|
||||||
|
)
|
||||||
# 数据所属部门字段
|
# 数据所属部门字段
|
||||||
dept_belong_id_field_name = 'dept_belong_id'
|
dept_belong_id_field_name = "dept_belong_id"
|
||||||
# 添加默认时间返回格式
|
# 添加默认时间返回格式
|
||||||
create_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
|
create_datetime = serializers.DateTimeField(
|
||||||
update_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False)
|
format="%Y-%m-%d %H:%M:%S", required=False, read_only=True
|
||||||
|
)
|
||||||
|
update_datetime = serializers.DateTimeField(
|
||||||
|
format="%Y-%m-%d %H:%M:%S", required=False
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self, instance=None, data=empty, request=None, **kwargs):
|
def __init__(self, instance=None, data=empty, request=None, **kwargs):
|
||||||
super().__init__(instance, data, **kwargs)
|
super().__init__(instance, data, **kwargs)
|
||||||
self.request: Request = request or self.context.get('request', None)
|
self.request: Request = request or self.context.get("request", None)
|
||||||
|
|
||||||
def save(self, **kwargs):
|
def save(self, **kwargs):
|
||||||
return super().save(**kwargs)
|
return super().save(**kwargs)
|
||||||
|
@ -60,30 +69,36 @@ class CustomModelSerializer(DynamicFieldsMixin,ModelSerializer):
|
||||||
if self.creator_field_id in self.fields.fields:
|
if self.creator_field_id in self.fields.fields:
|
||||||
validated_data[self.creator_field_id] = self.request.user
|
validated_data[self.creator_field_id] = self.request.user
|
||||||
|
|
||||||
if self.dept_belong_id_field_name in self.fields.fields and validated_data.get(
|
if (
|
||||||
self.dept_belong_id_field_name, None) is None:
|
self.dept_belong_id_field_name in self.fields.fields
|
||||||
validated_data[self.dept_belong_id_field_name] = getattr(self.request.user, 'dept_id', None)
|
and validated_data.get(self.dept_belong_id_field_name, None) is None
|
||||||
|
):
|
||||||
|
validated_data[self.dept_belong_id_field_name] = getattr(
|
||||||
|
self.request.user, "dept_id", None
|
||||||
|
)
|
||||||
return super().create(validated_data)
|
return super().create(validated_data)
|
||||||
|
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
if self.request:
|
if self.request:
|
||||||
if hasattr(self.instance, self.modifier_field_id):
|
if hasattr(self.instance, self.modifier_field_id):
|
||||||
setattr(self.instance, self.modifier_field_id, self.get_request_user_id())
|
setattr(
|
||||||
|
self.instance, self.modifier_field_id, self.get_request_user_id()
|
||||||
|
)
|
||||||
return super().update(instance, validated_data)
|
return super().update(instance, validated_data)
|
||||||
|
|
||||||
def get_request_username(self):
|
def get_request_username(self):
|
||||||
if getattr(self.request, 'user', None):
|
if getattr(self.request, "user", None):
|
||||||
return getattr(self.request.user, 'username', None)
|
return getattr(self.request.user, "username", None)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_request_name(self):
|
def get_request_name(self):
|
||||||
if getattr(self.request, 'user', None):
|
if getattr(self.request, "user", None):
|
||||||
return getattr(self.request.user, 'name', None)
|
return getattr(self.request.user, "name", None)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_request_user_id(self):
|
def get_request_user_id(self):
|
||||||
if getattr(self.request, 'user', None):
|
if getattr(self.request, "user", None):
|
||||||
return getattr(self.request.user, 'id', None)
|
return getattr(self.request.user, "id", None)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# @cached_property
|
# @cached_property
|
||||||
|
@ -132,4 +147,3 @@ class CustomModelSerializer(DynamicFieldsMixin,ModelSerializer):
|
||||||
# fields.pop(field, None)
|
# fields.pop(field, None)
|
||||||
#
|
#
|
||||||
# return fields
|
# return fields
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,9 @@
|
||||||
v-if="show"
|
v-if="show"
|
||||||
class="d2-source"
|
class="d2-source"
|
||||||
:class="{ 'd2-source--active': isActive }"
|
:class="{ 'd2-source--active': isActive }"
|
||||||
@click="handleClick">
|
@click="handleClick"
|
||||||
<d2-icon name="code"/> 本页源码
|
>
|
||||||
|
<d2-icon name="code" /> 本页源码
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -51,11 +52,11 @@ export default {
|
||||||
$paddingLR: 15px;
|
$paddingLR: 15px;
|
||||||
$paddingTB: 7px;
|
$paddingTB: 7px;
|
||||||
$fontSize: 12px;
|
$fontSize: 12px;
|
||||||
$rightOuter: $paddingLR / 2;
|
$rightOuter: calc($paddingLR / 2);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 9999;
|
z-index: 9999;
|
||||||
right: - $borderRadius - $rightOuter;
|
right: -$borderRadius - $rightOuter;
|
||||||
bottom: 20px;
|
bottom: 20px;
|
||||||
font-size: $fontSize;
|
font-size: $fontSize;
|
||||||
line-height: $fontSize;
|
line-height: $fontSize;
|
||||||
|
@ -63,17 +64,17 @@ export default {
|
||||||
border-radius: $borderRadius;
|
border-radius: $borderRadius;
|
||||||
padding: $paddingTB $paddingLR;
|
padding: $paddingTB $paddingLR;
|
||||||
padding-right: $borderRadius + $paddingLR;
|
padding-right: $borderRadius + $paddingLR;
|
||||||
background-color: rgba(#000, .7);
|
background-color: rgba(#000, 0.7);
|
||||||
border: 1px solid #000;
|
border: 1px solid #000;
|
||||||
color: #FFF;
|
color: #fff;
|
||||||
transition: all .3s;
|
transition: all 0.3s;
|
||||||
@extend %unable-select;
|
@extend %unable-select;
|
||||||
&.d2-source--active {
|
&.d2-source--active {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
&:hover {
|
&:hover {
|
||||||
right: - $borderRadius;
|
right: -$borderRadius;
|
||||||
background-color: rgba(#000, .9);
|
background-color: rgba(#000, 0.9);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -86,14 +86,15 @@
|
||||||
<span>注册用户</span>
|
<span>注册用户</span>
|
||||||
</p> -->
|
</p> -->
|
||||||
<!-- quick login -->
|
<!-- quick login -->
|
||||||
<!-- <el-button
|
<el-button
|
||||||
class="page-login--quick"
|
class="page-login--quick"
|
||||||
size="default"
|
size="default"
|
||||||
type="info"
|
type="info"
|
||||||
@click="dialogVisible = true"
|
@click="dialogVisible = true"
|
||||||
|
v-if="$env === 'development'"
|
||||||
>
|
>
|
||||||
快速选择用户(测试功能)
|
快速选择用户(限dev环境)
|
||||||
</el-button> -->
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="page-login--content-footer">
|
<div class="page-login--content-footer">
|
||||||
|
@ -151,19 +152,14 @@ export default {
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
users: [
|
users: [
|
||||||
{
|
{
|
||||||
name: 'Admin',
|
name: '超管',
|
||||||
|
username: 'superadmin',
|
||||||
|
password: 'admin123456'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '管理员',
|
||||||
username: 'admin',
|
username: 'admin',
|
||||||
password: 'admin'
|
password: 'admin123456'
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Editor',
|
|
||||||
username: 'editor',
|
|
||||||
password: 'editor'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'User1',
|
|
||||||
username: 'user1',
|
|
||||||
password: 'user1'
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
// 表单
|
// 表单
|
||||||
|
@ -220,7 +216,8 @@ export default {
|
||||||
handleUserBtnClick (user) {
|
handleUserBtnClick (user) {
|
||||||
this.formLogin.username = user.username
|
this.formLogin.username = user.username
|
||||||
this.formLogin.password = user.password
|
this.formLogin.password = user.password
|
||||||
this.submit()
|
// this.submit()
|
||||||
|
this.dialogVisible = false
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* @description 提交表单
|
* @description 提交表单
|
||||||
|
|
Loading…
Reference in New Issue