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): | ||||
|         parser.add_argument('init_name', nargs='*', type=str, ) | ||||
|         parser.add_argument('-y', nargs='*') | ||||
|         parser.add_argument('-Y', nargs='*') | ||||
|         parser.add_argument('-n', nargs='*') | ||||
|         parser.add_argument('-N', nargs='*') | ||||
|         parser.add_argument( | ||||
|             "init_name", | ||||
|             nargs="*", | ||||
|             type=str, | ||||
|         ) | ||||
|         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): | ||||
|         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 | ||||
|         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 | ||||
|         print(f"正在准备初始化数据,{'如有初始化数据,将会不做操作跳过' if not reset else '初始数据将会先删除后新增'}...") | ||||
| 
 | ||||
|         for app in settings.INSTALLED_APPS: | ||||
| 
 | ||||
|             try: | ||||
|                 exec(f""" | ||||
| from {app}.initialize import main | ||||
|                 exec( | ||||
|                     f""" | ||||
| from {app}.util.initialize import main | ||||
| main(reset={reset}) | ||||
|                 """) | ||||
|                 """ | ||||
|                 ) | ||||
|             except ModuleNotFoundError: | ||||
|                 pass | ||||
|         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 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class CustomModelSerializer(DynamicFieldsMixin,ModelSerializer): | ||||
| class CustomModelSerializer(DynamicFieldsMixin, ModelSerializer): | ||||
|     """ | ||||
|     增强DRF的ModelSerializer,可自动更新模型的审计字段记录 | ||||
|     (1)self.request能获取到rest_framework.request.Request对象 | ||||
|     """ | ||||
| 
 | ||||
|     # 修改人的审计字段名称, 默认modifier, 继承使用时可自定义覆盖 | ||||
|     modifier_field_id = 'modifier' | ||||
|     modifier_field_id = "modifier" | ||||
|     modifier_name = serializers.SerializerMethodField(read_only=True) | ||||
| 
 | ||||
|     def get_modifier_name(self, instance): | ||||
|         if not hasattr(instance, 'modifier'): | ||||
|         if not hasattr(instance, "modifier"): | ||||
|             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: | ||||
|             return queryset | ||||
|         return None | ||||
| 
 | ||||
|     # 创建人的审计字段名称, 默认creator, 继承使用时可自定义覆盖 | ||||
|     creator_field_id = 'creator' | ||||
|     creator_name = serializers.SlugRelatedField(slug_field="name", source="creator", read_only=True) | ||||
|     creator_field_id = "creator" | ||||
|     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) | ||||
|     update_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False) | ||||
| 
 | ||||
|     create_datetime = serializers.DateTimeField( | ||||
|         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): | ||||
|         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): | ||||
|         return super().save(**kwargs) | ||||
|  | @ -60,30 +69,36 @@ class CustomModelSerializer(DynamicFieldsMixin,ModelSerializer): | |||
|                 if self.creator_field_id in self.fields.fields: | ||||
|                     validated_data[self.creator_field_id] = self.request.user | ||||
| 
 | ||||
|                 if self.dept_belong_id_field_name in self.fields.fields 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) | ||||
|                 if ( | ||||
|                     self.dept_belong_id_field_name in self.fields.fields | ||||
|                     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) | ||||
| 
 | ||||
|     def update(self, instance, validated_data): | ||||
|         if self.request: | ||||
|             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) | ||||
| 
 | ||||
|     def get_request_username(self): | ||||
|         if getattr(self.request, 'user', None): | ||||
|             return getattr(self.request.user, 'username', None) | ||||
|         if getattr(self.request, "user", None): | ||||
|             return getattr(self.request.user, "username", None) | ||||
|         return None | ||||
| 
 | ||||
|     def get_request_name(self): | ||||
|         if getattr(self.request, 'user', None): | ||||
|             return getattr(self.request.user, 'name', None) | ||||
|         if getattr(self.request, "user", None): | ||||
|             return getattr(self.request.user, "name", None) | ||||
|         return None | ||||
| 
 | ||||
|     def get_request_user_id(self): | ||||
|         if getattr(self.request, 'user', None): | ||||
|             return getattr(self.request.user, 'id', None) | ||||
|         if getattr(self.request, "user", None): | ||||
|             return getattr(self.request.user, "id", None) | ||||
|         return None | ||||
| 
 | ||||
|     # @cached_property | ||||
|  | @ -132,4 +147,3 @@ class CustomModelSerializer(DynamicFieldsMixin,ModelSerializer): | |||
|     #             fields.pop(field, None) | ||||
|     # | ||||
|     #     return fields | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,8 +3,9 @@ | |||
|     v-if="show" | ||||
|     class="d2-source" | ||||
|     :class="{ 'd2-source--active': isActive }" | ||||
|     @click="handleClick"> | ||||
|     <d2-icon name="code"/> 本页源码 | ||||
|     @click="handleClick" | ||||
|   > | ||||
|     <d2-icon name="code" /> 本页源码 | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
|  | @ -51,11 +52,11 @@ export default { | |||
|   $paddingLR: 15px; | ||||
|   $paddingTB: 7px; | ||||
|   $fontSize: 12px; | ||||
|   $rightOuter: $paddingLR / 2; | ||||
|   $rightOuter: calc($paddingLR / 2); | ||||
|   opacity: 0; | ||||
|   position: fixed; | ||||
|   z-index: 9999; | ||||
|   right: - $borderRadius - $rightOuter; | ||||
|   right: -$borderRadius - $rightOuter; | ||||
|   bottom: 20px; | ||||
|   font-size: $fontSize; | ||||
|   line-height: $fontSize; | ||||
|  | @ -63,17 +64,17 @@ export default { | |||
|   border-radius: $borderRadius; | ||||
|   padding: $paddingTB $paddingLR; | ||||
|   padding-right: $borderRadius + $paddingLR; | ||||
|   background-color: rgba(#000, .7); | ||||
|   background-color: rgba(#000, 0.7); | ||||
|   border: 1px solid #000; | ||||
|   color: #FFF; | ||||
|   transition: all .3s; | ||||
|   color: #fff; | ||||
|   transition: all 0.3s; | ||||
|   @extend %unable-select; | ||||
|   &.d2-source--active { | ||||
|     opacity: 1; | ||||
|   } | ||||
|   &:hover { | ||||
|     right: - $borderRadius; | ||||
|     background-color: rgba(#000, .9); | ||||
|     right: -$borderRadius; | ||||
|     background-color: rgba(#000, 0.9); | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|  |  | |||
|  | @ -86,14 +86,15 @@ | |||
|               <span>注册用户</span> | ||||
|             </p> --> | ||||
|             <!-- quick login --> | ||||
|             <!-- <el-button | ||||
|             <el-button | ||||
|               class="page-login--quick" | ||||
|               size="default" | ||||
|               type="info" | ||||
|               @click="dialogVisible = true" | ||||
|               v-if="$env === 'development'" | ||||
|             > | ||||
|               快速选择用户(测试功能) | ||||
|             </el-button> --> | ||||
|               快速选择用户(限dev环境) | ||||
|             </el-button> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="page-login--content-footer"> | ||||
|  | @ -151,19 +152,14 @@ export default { | |||
|       dialogVisible: false, | ||||
|       users: [ | ||||
|         { | ||||
|           name: 'Admin', | ||||
|           name: '超管', | ||||
|           username: 'superadmin', | ||||
|           password: 'admin123456' | ||||
|         }, | ||||
|         { | ||||
|           name: '管理员', | ||||
|           username: 'admin', | ||||
|           password: 'admin' | ||||
|         }, | ||||
|         { | ||||
|           name: 'Editor', | ||||
|           username: 'editor', | ||||
|           password: 'editor' | ||||
|         }, | ||||
|         { | ||||
|           name: 'User1', | ||||
|           username: 'user1', | ||||
|           password: 'user1' | ||||
|           password: 'admin123456' | ||||
|         } | ||||
|       ], | ||||
|       // 表单 | ||||
|  | @ -220,7 +216,8 @@ export default { | |||
|     handleUserBtnClick (user) { | ||||
|       this.formLogin.username = user.username | ||||
|       this.formLogin.password = user.password | ||||
|       this.submit() | ||||
|       // this.submit() | ||||
|       this.dialogVisible = false | ||||
|     }, | ||||
|     /** | ||||
|      * @description 提交表单 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Angelo
						Angelo