From e900deb2b40edf8616644233e325bdf29efd80b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Sat, 27 Mar 2021 10:49:29 +0800 Subject: [PATCH 01/11] =?UTF-8?q?-=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=B8=85=E7=90=86=E5=BA=9F=E5=BC=83=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8A=9F=E8=83=BD=20-=E6=96=87=E4=BB=B6=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E2=80=94=E2=80=94=E6=96=87=E4=BB=B6=E6=9D=A5=E6=BA=90?= =?UTF-8?q?(=E5=AF=BC=E5=87=BA=E3=80=81=E7=94=A8=E6=88=B7=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apps/vadmin/op_drf/serializers.py | 1 + dvadmin-backend/apps/vadmin/system/filters.py | 1 + .../apps/vadmin/system/models/save_file.py | 1 + .../apps/vadmin/system/serializers.py | 9 ++-- dvadmin-backend/apps/vadmin/system/urls.py | 2 + dvadmin-backend/apps/vadmin/system/views.py | 24 ++++++++++ .../apps/vadmin/utils/export_excel.py | 2 + .../apps/vadmin/utils/file_util.py | 48 +++++++++++++++++++ dvadmin-backend/requirements.txt | 1 + dvadmin-ui/package.json | 4 +- .../views/vadmin/system/savefile/index.vue | 46 ++++++++++++++++-- 11 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 dvadmin-backend/apps/vadmin/utils/file_util.py diff --git a/dvadmin-backend/apps/vadmin/op_drf/serializers.py b/dvadmin-backend/apps/vadmin/op_drf/serializers.py index 5e47537..b642d9e 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/serializers.py +++ b/dvadmin-backend/apps/vadmin/op_drf/serializers.py @@ -20,6 +20,7 @@ class CustomModelSerializer(ModelSerializer): # 添加默认时间返回格式 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, read_only=True) + creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) def __init__(self, instance=None, data=empty, request=None, **kwargs): super().__init__(instance, data, **kwargs) diff --git a/dvadmin-backend/apps/vadmin/system/filters.py b/dvadmin-backend/apps/vadmin/system/filters.py index 5db8619..e91edaa 100644 --- a/dvadmin-backend/apps/vadmin/system/filters.py +++ b/dvadmin-backend/apps/vadmin/system/filters.py @@ -43,6 +43,7 @@ class SaveFileFilter(django_filters.rest_framework.FilterSet): 文件管理 简单过滤器 """ name = django_filters.CharFilter(lookup_expr='icontains') + type = django_filters.CharFilter(lookup_expr='icontains') class Meta: model = SaveFile diff --git a/dvadmin-backend/apps/vadmin/system/models/save_file.py b/dvadmin-backend/apps/vadmin/system/models/save_file.py index 62b077f..b43757d 100644 --- a/dvadmin-backend/apps/vadmin/system/models/save_file.py +++ b/dvadmin-backend/apps/vadmin/system/models/save_file.py @@ -16,6 +16,7 @@ class SaveFile(CoreModel): type = CharField(max_length=32, verbose_name="文件类型", null=True, blank=True) size = CharField(max_length=64, verbose_name="文件大小", null=True, blank=True) address = CharField(max_length=16, verbose_name="存储位置", null=True, blank=True) # 本地、阿里云、腾讯云.. + source = CharField(max_length=16, verbose_name="文件来源", null=True, blank=True) # 导出、用户上传. oss_url = CharField(max_length=200, verbose_name="OSS地址", null=True, blank=True) status = BooleanField(default=True, verbose_name="文件是否存在") file = FileField(verbose_name="文件URL", upload_to=files_path, ) diff --git a/dvadmin-backend/apps/vadmin/system/serializers.py b/dvadmin-backend/apps/vadmin/system/serializers.py index 31d01a9..e1f2e13 100644 --- a/dvadmin-backend/apps/vadmin/system/serializers.py +++ b/dvadmin-backend/apps/vadmin/system/serializers.py @@ -120,7 +120,7 @@ class ConfigSettingsCreateUpdateSerializer(CustomModelSerializer): # ================================================= # -# ************** 参数设置 序列化器 ************** # +# ************** 文件管理 序列化器 ************** # # ================================================= # class SaveFileSerializer(CustomModelSerializer): @@ -136,7 +136,7 @@ class SaveFileSerializer(CustomModelSerializer): class SaveFileCreateUpdateSerializer(CustomModelSerializer): """ - 字典详情 创建/更新时的列化器 + 文件管理 创建/更新时的列化器 """ file_url = serializers.CharField(source='file.url', read_only=True) @@ -146,6 +146,7 @@ class SaveFileCreateUpdateSerializer(CustomModelSerializer): self.validated_data['size'] = files.size self.validated_data['type'] = files.content_type self.validated_data['address'] = '本地存储' + self.validated_data['source'] = '用户上传' instance = super().save(**kwargs) # 进行判断是否需要OSS上传 return instance @@ -228,7 +229,6 @@ class LoginInforSerializer(CustomModelSerializer): """ 登录日志 简单序列化器 """ - creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) class Meta: model = LoginInfor @@ -239,7 +239,6 @@ class ExportLoginInforSerializer(CustomModelSerializer): """ 导出 登录日志 简单序列化器 """ - creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) class Meta: model = LoginInfor @@ -255,7 +254,6 @@ class OperationLogSerializer(CustomModelSerializer): """ 操作日志 简单序列化器 """ - creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) class Meta: model = OperationLog @@ -266,7 +264,6 @@ class ExportOperationLogSerializer(CustomModelSerializer): """ 导出 操作日志 简单序列化器 """ - creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) class Meta: model = OperationLog diff --git a/dvadmin-backend/apps/vadmin/system/urls.py b/dvadmin-backend/apps/vadmin/system/urls.py index d275369..43394f3 100644 --- a/dvadmin-backend/apps/vadmin/system/urls.py +++ b/dvadmin-backend/apps/vadmin/system/urls.py @@ -42,5 +42,7 @@ urlpatterns = [ re_path('celery_log/clean/', CeleryLogModelViewSet.as_view({'delete': 'clean_all', })), # 导出定时日志 re_path('celery_log/export/', CeleryLogModelViewSet.as_view({'get': 'export', })), + # 清除废弃文件 + re_path('clearsavefile/', SaveFileModelViewSet.as_view({'post': 'clearsavefile', })), ] urlpatterns += router.urls diff --git a/dvadmin-backend/apps/vadmin/system/views.py b/dvadmin-backend/apps/vadmin/system/views.py index ba4ce25..2253b22 100644 --- a/dvadmin-backend/apps/vadmin/system/views.py +++ b/dvadmin-backend/apps/vadmin/system/views.py @@ -1,3 +1,6 @@ +import os + +from django.conf import settings from django.db.models import Q from rest_framework.request import Request @@ -16,6 +19,7 @@ from ..system.serializers import DictDataSerializer, DictDataCreateUpdateSeriali OperationLogSerializer, ExportOperationLogSerializer, ExportLoginInforSerializer, CeleryLogSerializer, \ ExportCeleryLogSerializer from ..utils.export_excel import export_excel_save_model +from ..utils.file_util import get_all_files, remove_empty_dir, delete_files from ..utils.response import SuccessResponse @@ -149,6 +153,26 @@ class SaveFileModelViewSet(CustomModelViewSet): search_fields = ('configName',) ordering = '-create_datetime' # 默认排序 + def clearsavefile(self, request: Request, *args, **kwargs): + """ + 清理废弃文件 + :param request: + :param args: + :param kwargs: + :return: + """ + # 获取废弃文件列表 + file_list = get_all_files(os.path.join(settings.MEDIA_ROOT, 'system')) + queryset_files = [os.path.join(os.path.join(settings.MEDIA_ROOT) + os.sep, ele) for ele in + list(self.get_queryset().values_list('file', flat=True))] + + delete_list = list(set(file_list) - set(queryset_files)) + # 进行文件删除操作 + delete_files(delete_list) + # 递归删除空文件 + remove_empty_dir(os.path.join(settings.MEDIA_ROOT, 'system')) + return SuccessResponse(msg=f"成功清理废弃文件{len(delete_list)}个") + class MessagePushModelViewSet(CustomModelViewSet): """ diff --git a/dvadmin-backend/apps/vadmin/utils/export_excel.py b/dvadmin-backend/apps/vadmin/utils/export_excel.py index c6484bd..eda0567 100644 --- a/dvadmin-backend/apps/vadmin/utils/export_excel.py +++ b/dvadmin-backend/apps/vadmin/utils/export_excel.py @@ -134,7 +134,9 @@ def export_excel_save_model(request, field_data, data, FilName): savefile.type = 'application/vnd.ms-excel' savefile.size = os.path.getsize(os.path.join(settings.MEDIA_ROOT, file_rul)) savefile.address = '本地存储' + savefile.source = '导出' savefile.creator = request.user + savefile.dept_belong_id = getattr(request.user, 'dept_id', None) savefile.modifier = request.user.username savefile.save() return SaveFileSerializer(savefile).data diff --git a/dvadmin-backend/apps/vadmin/utils/file_util.py b/dvadmin-backend/apps/vadmin/utils/file_util.py new file mode 100644 index 0000000..1a3cdca --- /dev/null +++ b/dvadmin-backend/apps/vadmin/utils/file_util.py @@ -0,0 +1,48 @@ +""" +封装文件操作: + ● 递归读取所有文件目录形成列表 + ● 递归删除空目录 + ● 批量删除文件 +""" +import os + + +def get_all_files(targetDir): + """ + 递归读取所有文件目录形成列表 + :param targetDir: + :return: + """ + files = [] + listFiles = os.listdir(targetDir) + for i in range(0, len(listFiles)): + path = os.path.join(targetDir, listFiles[i]) + if os.path.isdir(path): + files.extend(get_all_files(path)) + elif os.path.isfile(path): + files.append(path) + return files + + +def remove_empty_dir(path): + """ + 递归删除空目录 + :param path: + :return: + """ + for root, dirs, files in os.walk(path, topdown=False): + if not files and not dirs: + os.rmdir(root) + + +def delete_files(delete_list: list): + """ + 批量删除文件 + :param delete_list: + :return: + """ + for file_path in delete_list: + try: + os.remove(file_path) + except(FileNotFoundError): + pass diff --git a/dvadmin-backend/requirements.txt b/dvadmin-backend/requirements.txt index e6f6139..5e06ebc 100644 --- a/dvadmin-backend/requirements.txt +++ b/dvadmin-backend/requirements.txt @@ -1,4 +1,5 @@ asgiref==3.3.1 +celery==5.0.5 Django==2.2.16 django-cors-headers==3.7.0 django_celery_beat==2.2.0 diff --git a/dvadmin-ui/package.json b/dvadmin-ui/package.json index 2637669..beaf7ec 100755 --- a/dvadmin-ui/package.json +++ b/dvadmin-ui/package.json @@ -79,8 +79,8 @@ "vue-template-compiler": "2.6.12" }, "engines": { - "node": ">=8.9", - "npm": ">= 3.0.0" + "node": ">=12.0", + "npm": ">= 6.0.0" }, "browserslist": [ "> 1%", diff --git a/dvadmin-ui/src/views/vadmin/system/savefile/index.vue b/dvadmin-ui/src/views/vadmin/system/savefile/index.vue index ba35fe4..cbd4839 100755 --- a/dvadmin-ui/src/views/vadmin/system/savefile/index.vue +++ b/dvadmin-ui/src/views/vadmin/system/savefile/index.vue @@ -14,7 +14,7 @@ - - + + + + + + + + +