tsurumure 6 місяців тому
батько
коміт
35888f91c2

+ 8 - 7
db/sys_common.sql

@@ -12,18 +12,19 @@ CREATE TABLE `sys_common` (
     `description` VARCHAR(100) COMMENT '配置描述',
     `tag` VARCHAR(100) COMMENT '配置键',
     `value` TEXT COMMENT '配置值',
-    `value_type` VARCHAR(20) DEFAULT 'text' COMMENT '配置值类型 (Text, Textarea, Number, Radio, Checkbox, Select)',
+    `value_type` VARCHAR(10) DEFAULT 'String' COMMENT '配置值类型 (String, Integer, Float)',
+    `value_component` VARCHAR(20) DEFAULT 'text' COMMENT '配置组件 (Text, Textarea, Number, Radio, Checkbox, Select)',
     `value_option` TEXT COMMENT '配置值选项 (除文本框外必填)',
     `category` VARCHAR(20) NOT NULL COMMENT '分类',
     `sort` INT DEFAULT '1' COMMENT '排序',
     `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';
 
-INSERT INTO sys_common(name, description, tag, value, value_type, value_option, category, sort) VALUES
-    ('上传存储介质', '使用本地或云存储桶来存放文件', 'UPLOAD_TARGET',  3, 'Radio', '[{\"label\":\"本地\",\"value\":\"-1\",\"disabled\":true},{\"label\":\"腾讯云\",\"value\":\"1\",\"disabled\":false},{\"label\":\"阿里云\",\"value\":\"2\",\"disabled\":true},{\"label\":\"抖音云\",\"value\":\"3\",\"disabled\":false}]', 'UPLOAD', 3),
-    ('单文件上传大小限制(MB)', null, 'UPLOAD_MAX_SIZE_MB', 100, 'Number', null, 'UPLOAD', 2),
-    ('是否启用文件MD5查重', '已存在的文件不再重复上传,仅返回链接', 'UPLOAD_MD5_DUPLICATE', 1, 'Switch', null, 'UPLOAD', 1),
+INSERT INTO sys_common(name, description, tag, value, value_type, value_component, value_option, category, sort) VALUES
+    ('上传存储介质', '使用本地或云存储桶来存放文件', 'UPLOAD_TARGET',  3, 'Integer', 'Radio', '[{\"label\":\"本地\",\"value\":-1,\"disabled\":true},{\"label\":\"腾讯云\",\"value\":1,\"disabled\":false},{\"label\":\"阿里云\",\"value\":2,\"disabled\":true},{\"label\":\"抖音云\",\"value\":3,\"disabled\":false}]', 'UPLOAD', 3),
+    ('单文件上传大小限制(MB)', null, 'UPLOAD_MAX_SIZE_MB', 100, 'Integer', 'Number', null, 'UPLOAD', 2),
+    ('是否启用文件MD5查重', '已存在的文件不再重复上传,仅返回链接', 'UPLOAD_MD5_DUPLICATE', 1, 'Integer', 'Switch', null, 'UPLOAD', 1),
 
-    ('系统用户登录过期时间(小时)', null, 'SYSTEM_USER_LOGIN_DURATION_DEFAULT', 24, 'Number', null, 'SYSTEM_USER', 1),
-    ('是否允许系统用户注册', null, 'SYSTEM_USER_ALLOW_REGISTER', 1, 'Switch', null, 'SYSTEM_USER', 1)
+    ('系统用户登录过期时间(小时)', null, 'SYSTEM_USER_LOGIN_DURATION_DEFAULT', 24, 'Integer', 'Number', null, 'SYSTEM_USER', 1),
+    ('是否允许系统用户注册', null, 'SYSTEM_USER_ALLOW_REGISTER', 1, 'Integer', 'Switch', null, 'SYSTEM_USER', 1)
 ;

+ 2 - 2
src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/service/TencentCosService.java

@@ -16,8 +16,8 @@ public interface TencentCosService {
     // [腾讯云COS] 删除对象
     void deleteObject(String object_key);
 
-    // [腾讯云COS] 批量删除对象
-    void deleteObjects(String object_keys);
+//    // [腾讯云COS] 批量删除对象
+//    void deleteObjects(String object_keys);
 
 
     // [腾讯云COS] 查询对象是否存在

+ 5 - 6
src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/service/impl/TencentCosServiceImpl.java

@@ -218,12 +218,11 @@ public class TencentCosServiceImpl implements TencentCosService {
         cosClient.shutdown();
     }
 
-    // [腾讯云COS] 批量删除对象
-    // https://cloud.tencent.com/document/product/436/65939#841fe310-bdf8-4789-9bc0-26ea844e316d
-    @Override
-    public void deleteObjects(String object_keys) {
-    }
-
+//    // [腾讯云COS] 批量删除对象
+//    // https://cloud.tencent.com/document/product/436/65939#841fe310-bdf8-4789-9bc0-26ea844e316d
+//    @Override
+//    public void deleteObjects(String object_keys) {
+//    }
 
 
     // [腾讯云COS] 获得临时图片地址

+ 5 - 1
src/main/java/com/backendsys/modules/system/entity/SysCommon.java

@@ -27,8 +27,12 @@ public class SysCommon {
     private String description;
     private String tag;
     private String value;
-    @RangeStringArray(message="配置值类型取值有误,范围应是(Text, Textarea, Number, Radio, Checkbox, Select, Switch)", value = { "Text", "Textarea", "Number", "Radio", "Checkbox", "Select", "Switch" }, groups = { Update.class })
+
+    @RangeStringArray(message = "配置值类型取值有误,范围应是(String, Integer, Float)", value = { "String", "Integer", "Float" }, groups = { Update.class })
     private String value_type;
+    @RangeStringArray(message = "配置组件取值有误,范围应是(Text, Textarea, Number, Radio, Checkbox, Select, Switch)", value = { "Text", "Textarea", "Number", "Radio", "Checkbox", "Select", "Switch" }, groups = { Update.class })
+    private String value_component;
+
     private String value_option;
     @Size(max = 20, message = "分类长度不超过 {max} 个字符", groups = { Update.class })
     private String category;

+ 39 - 20
src/main/java/com/backendsys/modules/upload/service/impl/SysFileServiceImpl.java

@@ -26,6 +26,7 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -216,6 +217,25 @@ public class SysFileServiceImpl implements SysFileService {
 
     }
 
+
+    // target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
+    private void deleteObject(String object_key, Integer target) {
+        if (target == 1) {
+            // [腾讯云] 删除对象
+            tencentCosService.deleteObject(object_key);
+            System.out.println("Delete tencent cos object: " + object_key);
+        }
+        if (target == 3) {
+            // [抖音云] 删除对象
+            try {
+                douyinTosService.deleteObject(object_key);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            System.out.println("Delete douyin tos object: " + object_key);
+        }
+    }
+
     /**
      * 删除文件 (包括缩略图,如果有的话)
      */
@@ -232,24 +252,7 @@ public class SysFileServiceImpl implements SysFileService {
 
         // [异步任务] 创建一个 CompletableFuture 来执行异步任务
         CompletableFuture.runAsync(() -> {
-
-            // target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
-            Integer target = entity.getTarget();
-            if (target == 1) {
-                // [腾讯云] 删除对象
-                tencentCosService.deleteObject(object_key);
-                System.out.println("Delete tencent cos object: " + object_key);
-            }
-            if (target == 3) {
-                // [抖音云] 删除对象
-                try {
-                    douyinTosService.deleteObject(object_key);
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
-                }
-                System.out.println("Delete douyin tos object: " + object_key);
-            }
-
+            deleteObject(entity.getObject_key(), entity.getTarget());
         });
 
         return Map.of("object_key", object_key);
@@ -261,9 +264,25 @@ public class SysFileServiceImpl implements SysFileService {
     @Override
     public Map<String, Object> removeUploadFileBatch(SysFile sysFile) {
 
-        String object_keys = sysFile.getObject_keys();
+        List<String> object_keys = StrUtil.split(sysFile.getObject_keys(), ',', true, true);
+
+        // 判断是否存在
+        List<SysFile> sysFileList = sysFileDao.selectList(new LambdaQueryWrapper<SysFile>().in(SysFile::getObject_key, object_keys));
+        if (sysFileList != null && sysFileList.size() != object_keys.size()) {
+            throw new CustException("object_key 一个或多个不存在 (提交:" + object_keys.size() + ", 存在:" + sysFileList.size() + ")");
+        }
+
+        // [Delete] 批量删除
+        sysFileDao.delete(new LambdaQueryWrapper<SysFile>().in(SysFile::getObject_key, object_keys));
+
+        // [异步任务] 创建一个 CompletableFuture 来执行异步任务
+        CompletableFuture.runAsync(() -> {
+            sysFileList.stream().forEach(entity -> {
+                deleteObject(entity.getObject_key(), entity.getTarget());
+            });
+        });
 
-        return null;
+        return Map.of("object_keys", object_keys);
     }