!52 initialize脚本重构 & 部分bug修复
initialize脚本重构 & 部分bug修复:https://gitee.com/liqianglog/django-vue-admin/pulls/52/filespull/53/MERGE
						commit
						a2f109efcf
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												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""" | ||||
|                 exec( | ||||
|                     f""" | ||||
| from {app}.initialize import main | ||||
| main(reset={reset}) | ||||
|                 """) | ||||
|                 """ | ||||
|                 ) | ||||
|             except ModuleNotFoundError: | ||||
|                 pass | ||||
|         print("初始化数据完成!") | ||||
|  |  | |||
|  | @ -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
	
	 dvadmin
						dvadmin