From ce4d410e53f9a3c687ef6b264b7ca446fa241a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Tue, 16 May 2023 00:24:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=20=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/del_migrations.py | 2 +- backend/dvadmin/system/models.py | 14 +- backend/dvadmin/system/views/file_list.py | 52 +++++- web/src/views/system/fileList/index.vue | 191 +++++++++++++--------- 4 files changed, 177 insertions(+), 82 deletions(-) diff --git a/backend/del_migrations.py b/backend/del_migrations.py index 7512248..d649e05 100644 --- a/backend/del_migrations.py +++ b/backend/del_migrations.py @@ -4,7 +4,7 @@ import os exclude = ["venv"] # 需要排除的文件目录 for root, dirs, files in os.walk('.'): - dirs[:] = [d for d in set(dirs) - set(exclude)] + dirs[:] = list(set(dirs) - set(exclude)) if 'migrations' in dirs: dir = dirs[dirs.index('migrations')] for root_j, dirs_j, files_j in os.walk(os.path.join(root, dir)): diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 978085d..392a08e 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -289,8 +289,7 @@ class Dictionary(CoreModel): (7, "images"), ) 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( to="self", related_name="sublist", @@ -359,7 +358,11 @@ def media_file_name(instance, filename): class FileList(CoreModel): name = models.CharField(max_length=200, null=True, blank=True, verbose_name="名称", help_text="名称") - url = models.FileField(upload_to=media_file_name) + url = models.FileField(upload_to=media_file_name, null=True, blank=True,) + file_url = models.CharField(max_length=255, blank=True, verbose_name="文件地址", help_text="文件地址") + engine = models.CharField(max_length=100, default='local', blank=True, verbose_name="引擎", help_text="引擎") + mime_type = models.CharField(max_length=100, blank=True, verbose_name="Mime类型", help_text="Mime类型") + size = models.CharField(max_length=36, blank=True, verbose_name="文件大小", help_text="文件大小") md5sum = models.CharField(max_length=36, blank=True, verbose_name="文件md5", help_text="文件md5") def save(self, *args, **kwargs): @@ -368,6 +371,11 @@ class FileList(CoreModel): for chunk in self.url.chunks(): md5.update(chunk) self.md5sum = md5.hexdigest() + if not self.size: + self.size = self.url.size + if not self.file_url: + url = media_file_name(self,self.name) + self.file_url = f'media/{url}' super(FileList, self).save(*args, **kwargs) class Meta: diff --git a/backend/dvadmin/system/views/file_list.py b/backend/dvadmin/system/views/file_list.py index e079884..c122f03 100644 --- a/backend/dvadmin/system/views/file_list.py +++ b/backend/dvadmin/system/views/file_list.py @@ -1,5 +1,12 @@ +import hashlib +import mimetypes + from rest_framework import serializers +from rest_framework.decorators import action + +from application import dispatch from dvadmin.system.models import FileList +from dvadmin.utils.json_response import DetailResponse from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet @@ -8,15 +15,52 @@ class FileSerializer(CustomModelSerializer): url = serializers.SerializerMethodField(read_only=True) def get_url(self, instance): - return f'media/{str(instance.url)}' + # return 'media/' + str(instance.url) + return instance.file_url or (f'media/{str(instance.url)}') class Meta: model = FileList fields = "__all__" def create(self, validated_data): - validated_data['name'] = str(self.initial_data.get('file')) - validated_data['url'] = self.initial_data.get('file') + file_engine = dispatch.get_system_config_values("fileStorageConfig.file_engine") or 'local' + file_backup = dispatch.get_system_config_values("fileStorageConfig.file_backup") + file = self.initial_data.get('file') + file_size = file.size + validated_data['name'] = str(file) + validated_data['size'] = file_size + md5 = hashlib.md5() + for chunk in file.chunks(): + md5.update(chunk) + validated_data['md5sum'] = md5.hexdigest() + validated_data['engine'] = file_engine + validated_data['mime_type'] = file.content_type + if file_backup: + validated_data['url'] = file + if file_engine == 'oss': + from dvadmin_cloud_storage.views.aliyun import ali_oss_upload + file_path = ali_oss_upload(file) + if file_path: + validated_data['file_url'] = file_path + else: + raise ValueError("上传失败") + elif file_engine == 'cos': + from dvadmin_cloud_storage.views.tencent import tencent_cos_upload + file_path = tencent_cos_upload(file) + if file_path: + validated_data['file_url'] = file_path + else: + raise ValueError("上传失败") + else: + validated_data['url'] = file + # 审计字段 + try: + request_user = self.request.user + validated_data['dept_belong_id'] = request_user.dept.id + validated_data['creator'] = request_user.id + validated_data['modifier'] = request_user.id + except: + pass return super().create(validated_data) @@ -32,4 +76,4 @@ class FileViewSet(CustomModelViewSet): queryset = FileList.objects.all() serializer_class = FileSerializer filter_fields = ['name', ] - permission_classes = [] + permission_classes = [] \ No newline at end of file diff --git a/web/src/views/system/fileList/index.vue b/web/src/views/system/fileList/index.vue index e4ac060..0eab106 100644 --- a/web/src/views/system/fileList/index.vue +++ b/web/src/views/system/fileList/index.vue @@ -1,101 +1,143 @@