Procházet zdrojové kódy

1.添加 Region 和 Bucket 数据对象
2.添加操作 Region 和 Bucket 的接口

reghao před 3 roky
rodič
revize
ef4400b63b
20 změnil soubory, kde provedl 573 přidání a 135 odebrání
  1. 55 135
      src/main/java/cn/reghao/dfs/store/oss/controller/BucketBasicJsonController.java
  2. 166 0
      src/main/java/cn/reghao/dfs/store/oss/controller/ObjectBasicJsonController.java
  3. 39 0
      src/main/java/cn/reghao/dfs/store/oss/controller/RegionBasicJsonController.java
  4. 15 0
      src/main/java/cn/reghao/dfs/store/oss/db/mapper/BucketMapper.java
  5. 15 0
      src/main/java/cn/reghao/dfs/store/oss/db/mapper/RegionMapper.java
  6. 32 0
      src/main/java/cn/reghao/dfs/store/oss/model/dto/json/CreateBucket.java
  7. 18 0
      src/main/java/cn/reghao/dfs/store/oss/model/po/Bucket.java
  8. 18 0
      src/main/java/cn/reghao/dfs/store/oss/model/po/Region.java
  9. 13 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/KeyValue.java
  10. 16 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/RegionNames.java
  11. 17 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/Regions.java
  12. 14 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/json/ApplyServerSideEncryptionByDefault.java
  13. 21 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/json/BucketDetail.java
  14. 22 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/json/BucketGetResult.java
  15. 21 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/json/BucketInfo.java
  16. 17 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/json/BucketListResult.java
  17. 15 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/json/Owner.java
  18. 14 0
      src/main/java/cn/reghao/dfs/store/oss/model/vo/json/ServerSideEncryptionConfiguration.java
  19. 19 0
      src/main/resources/mapper/oss/BucketMapper.xml
  20. 26 0
      src/main/resources/mapper/oss/RegionMapper.xml

+ 55 - 135
src/main/java/cn/reghao/dfs/store/oss/controller/BucketBasicJsonController.java

@@ -1,166 +1,86 @@
 package cn.reghao.dfs.store.oss.controller;
 
-import cn.reghao.dfs.store.oss.db.mapper.FileMetaMapper;
-import cn.reghao.dfs.store.oss.db.mapper.FileTypeMapper;
-import cn.reghao.dfs.store.oss.model.dto.json.*;
-import cn.reghao.dfs.store.oss.model.po.FileMeta;
-import cn.reghao.jutil.jdk.converter.DateTimeConverter;
+import cn.reghao.dfs.store.oss.db.mapper.BucketMapper;
+import cn.reghao.dfs.store.oss.db.mapper.RegionMapper;
+import cn.reghao.dfs.store.oss.model.dto.json.CreateBucket;
+import cn.reghao.dfs.store.oss.model.po.Bucket;
+import cn.reghao.dfs.store.oss.model.vo.json.BucketGetResult;
+import cn.reghao.dfs.store.oss.model.vo.json.BucketListResult;
 import cn.reghao.jutil.jdk.result.WebBody;
-import cn.reghao.jutil.tool.id.IdGenerator;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author reghao
- * @date 2023-01-02 17:47:08
+ * @date 2023-01-04 16:46:45
  */
 @Api(tags = "存储桶基础操作接口")
 @RestController
 @RequestMapping("/ajax")
 public class BucketBasicJsonController {
-    private final FileMetaMapper fileMetaMapper;
-    private final FileTypeMapper fileTypeMapper;
-    private final IdGenerator objectIdGenerator;
-
-    public BucketBasicJsonController(FileMetaMapper fileMetaMapper, FileTypeMapper fileTypeMapper) {
-        this.fileMetaMapper = fileMetaMapper;
-        this.fileTypeMapper = fileTypeMapper;
-        this.objectIdGenerator = new IdGenerator(32, "object-id");
-    }
+    private final RegionMapper regionMapper;
+    private final BucketMapper bucketMapper;
 
-    @ApiOperation("获取文件图标")
-    @GetMapping(value = "/bucket/file/file_icon.json", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getFileIcon() {
-        List<FileIcon> list = fileTypeMapper.findAll1();
-        return WebBody.success(list);
+    public BucketBasicJsonController(RegionMapper regionMapper, BucketMapper bucketMapper) {
+        this.regionMapper = regionMapper;
+        this.bucketMapper = bucketMapper;
     }
 
-    @ApiOperation("获取存储桶中的部分对象")
-    @GetMapping(value = "/bucket/file/list_objects.json", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getObjects(@Validated GetObjects getObjects) {
-        String bucket = getObjects.getBucket();
-        String prefix = getObjects.getPrefix();
-        String startAfter = getObjects.getMarker();
-        String delimiter = getObjects.getDelimiter();
-        Integer maxKeys = getObjects.getMaxKeys();
-
-        int count = fileMetaMapper.count();
-        List<FileMeta> list = fileMetaMapper.findAll1(prefix);
-        List<ObjectJson> list1 = list.stream().map(fileMeta -> {
-            ObjectJson objectJson = new ObjectJson();
-            Integer fileTypeId = fileMeta.getFileTypeId();
-            objectJson.setDir(fileTypeId == 1000);
-
-            String objectName = fileMeta.getObjectName();
-            String[] names = objectName.split("/");
-            String name = names[names.length-1];
-            objectJson.setName(name);
-            objectJson.setPath(objectName);
-            long size = fileMeta.getSize();
-            objectJson.setSize(size);
-            objectJson.setFormattedSize(String.valueOf(size));
-            objectJson.setObjectType("Normal");
-            objectJson.setType(fileTypeId);
-            objectJson.setStorageClass("Standard");
-            objectJson.setTimeModified(DateTimeConverter.msTimestamp(fileMeta.getUpdateTime()));
-            return objectJson;
-        }).collect(Collectors.toList());
-
-        ListObjects listObjects = new ListObjects();
-        listObjects.setObjectList(list1);
-        listObjects.setBucketName(bucket);
-        listObjects.setDelimiter(delimiter);
-        listObjects.setMaxKeys(maxKeys);
-        listObjects.setObjectSize(0L);
-        listObjects.setTruncated(true);
-        return WebBody.success(listObjects);
+    @ApiOperation("查找存储桶名字是否存在")
+    @GetMapping(value = "/bucket/judge_exist.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String judgeExist(@RequestParam("region") String region, @RequestParam("bucketName") String bucketName) {
+        Bucket bucket = bucketMapper.findByName(bucketName);
+        return bucket == null ? WebBody.success() : WebBody.fail(null);
     }
 
-    @ApiOperation("创建目录")
-    @PostMapping(value = "/bucket/file/create_folder.json", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String createFolder(@Validated CreateFolder createFolder) {
-        String objectName = createFolder.getObjectName();
-        List<String> objectNames = new ArrayList<>();
-        String[] names = objectName.split("/");
-        for (int i = 0; i < names.length; i++) {
-            if (i == 0) {
-                objectNames.add(names[i] + "/");
-            } else {
-                String tmp = objectNames.get(i-1) + names[i] + "/";
-                objectNames.add(tmp);
-            }
-        }
-
-        FileMeta fileMeta;
-        int i = 0;
-        for (; i < objectNames.size(); i++) {
-            fileMeta = fileMetaMapper.findByObjectName(objectNames.get(i));
-            if (fileMeta == null) {
-                break;
-            }
+    @ApiOperation("创建存储桶")
+    @PostMapping(value = "/bucket/new_create_bucket.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String createBucket(@Validated CreateBucket createBucket) {
+        String region = createBucket.getRegion();
+        String bucketName = createBucket.getBucket();
+        String storageClass = createBucket.getStorage();
+        String acl = createBucket.getAcl();
+
+        Integer regionId = regionMapper.findIdByLocation(region);
+        if (regionId == null) {
+            return WebBody.fail(region + " 不存在");
         }
 
-        List<FileMeta> list = new ArrayList<>();
-        for (int j = i; j < objectNames.size(); j++) {
-            String objectName1 = objectNames.get(j);
-            String objectId = objectIdGenerator.stringId();
-            String[] names1 = objectName1.split("/");
-            String filename = names1[names1.length-1];
-            list.add(new FileMeta(objectName1, objectId, filename, "tnb"));
+        Bucket bucket = bucketMapper.findByName(bucketName);
+        if (bucket == null) {
+            bucket = new Bucket();
+            bucket.setRegionId(regionId);
+            bucket.setName(bucketName);
+            bucket.setStorage(storageClass);
+            bucket.setAcl(acl);
+            bucketMapper.save(bucket);
+            return WebBody.success();
+        } else {
+            return WebBody.fail(bucketName + " 已存在");
         }
-
-        if (!list.isEmpty()) {
-            fileMetaMapper.saveAll(list);
-        }
-        return WebBody.success();
-    }
-
-    @ApiOperation("获取域名列表")
-    @GetMapping(value = "/bucket/domain/list.json", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String domainList() {
-        return WebBody.success();
     }
 
-    @ApiOperation("获取 bucket ACL")
-    @GetMapping(value = "/bucket/acl.json", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String bucketAcl() {
-        return WebBody.success();
+    @ApiOperation("获取存储桶列表")
+    @GetMapping(value = "/bucket/list.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getBucketList() {
+        BucketListResult bucketListResult = new BucketListResult();
+        return WebBody.success(bucketListResult);
     }
 
-    @ApiOperation("获取对象 ACL")
-    @GetMapping(value = "/bucket/file/get_object_acl.json", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String obejctAcl() {
-        return WebBody.success();
+    @ApiOperation("获取存储桶标签")
+    @GetMapping(value = "/bucket/tag.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getTag(@RequestParam("region") String region, @RequestParam("bucket") String bucket) {
+        BucketListResult bucketListResult = new BucketListResult();
+        return WebBody.success(bucketListResult);
     }
 
-    @ApiOperation("获取对象信息")
-    @GetMapping(value = "/bucket/file/head_object.json", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String headObject(@Validated HeadObject headObject) {
-        return WebBody.success();
-    }
-
-    @ApiOperation("生成带签名的 URL")
-    @PostMapping(value = "/bucket/file/generate_url_with_signed.json", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String generateSignedUrl(@Validated GenerateSignedUrl generateSignedUrl) {
-        String objectName = generateSignedUrl.getObjectName();
-        String url = String.format("//oss.reghao.cn/object/%s", objectName);
-        // 5 分钟后链接失效
-        long expires = System.currentTimeMillis()/1000 + 300;
-        String ossAccessId = "TMP.3KeSkQJhXm4fZNupmzTEFx8HQ7QobdYnbc4A5do6zvqDnkkHdwyKj2rvJzPCfprxBSfHM6H3tqci21rCnHwWEmVje3PHaA";
-        String signature = "C1NieNpY%2FrmgaHNM2PXTPU3Tshw%3D";
-        String param = String.format("Expires=%s&OSSAccessId=%s&Signature=%s", expires, ossAccessId, signature);
-
-        GenerateSignedUrlResult generateSignedUrlResult = new GenerateSignedUrlResult(url, param);
-        return WebBody.success(generateSignedUrlResult);
+    @ApiOperation("获取存储桶详情")
+    @GetMapping(value = "/bucket/get.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getBucket(@RequestParam("region") String region, @RequestParam("bucket") String bucket) {
+        BucketGetResult bucketGetResult = new BucketGetResult();
+        return WebBody.success(bucketGetResult);
     }
 }

+ 166 - 0
src/main/java/cn/reghao/dfs/store/oss/controller/ObjectBasicJsonController.java

@@ -0,0 +1,166 @@
+package cn.reghao.dfs.store.oss.controller;
+
+import cn.reghao.dfs.store.oss.db.mapper.FileMetaMapper;
+import cn.reghao.dfs.store.oss.db.mapper.FileTypeMapper;
+import cn.reghao.dfs.store.oss.model.dto.json.*;
+import cn.reghao.dfs.store.oss.model.po.FileMeta;
+import cn.reghao.jutil.jdk.converter.DateTimeConverter;
+import cn.reghao.jutil.jdk.result.WebBody;
+import cn.reghao.jutil.tool.id.IdGenerator;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2023-01-02 17:47:08
+ */
+@Api(tags = "存储桶中对象的基础操作接口")
+@RestController
+@RequestMapping("/ajax")
+public class ObjectBasicJsonController {
+    private final FileMetaMapper fileMetaMapper;
+    private final FileTypeMapper fileTypeMapper;
+    private final IdGenerator objectIdGenerator;
+
+    public ObjectBasicJsonController(FileMetaMapper fileMetaMapper, FileTypeMapper fileTypeMapper) {
+        this.fileMetaMapper = fileMetaMapper;
+        this.fileTypeMapper = fileTypeMapper;
+        this.objectIdGenerator = new IdGenerator(32, "object-id");
+    }
+
+    @ApiOperation("获取文件图标")
+    @GetMapping(value = "/bucket/file/file_icon.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getFileIcon() {
+        List<FileIcon> list = fileTypeMapper.findAll1();
+        return WebBody.success(list);
+    }
+
+    @ApiOperation("获取存储桶中的部分对象")
+    @GetMapping(value = "/bucket/file/list_objects.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getObjects(@Validated GetObjects getObjects) {
+        String bucket = getObjects.getBucket();
+        String prefix = getObjects.getPrefix();
+        String startAfter = getObjects.getMarker();
+        String delimiter = getObjects.getDelimiter();
+        Integer maxKeys = getObjects.getMaxKeys();
+
+        int count = fileMetaMapper.count();
+        List<FileMeta> list = fileMetaMapper.findAll1(prefix);
+        List<ObjectJson> list1 = list.stream().map(fileMeta -> {
+            ObjectJson objectJson = new ObjectJson();
+            Integer fileTypeId = fileMeta.getFileTypeId();
+            objectJson.setDir(fileTypeId == 1000);
+
+            String objectName = fileMeta.getObjectName();
+            String[] names = objectName.split("/");
+            String name = names[names.length-1];
+            objectJson.setName(name);
+            objectJson.setPath(objectName);
+            long size = fileMeta.getSize();
+            objectJson.setSize(size);
+            objectJson.setFormattedSize(String.valueOf(size));
+            objectJson.setObjectType("Normal");
+            objectJson.setType(fileTypeId);
+            objectJson.setStorageClass("Standard");
+            objectJson.setTimeModified(DateTimeConverter.msTimestamp(fileMeta.getUpdateTime()));
+            return objectJson;
+        }).collect(Collectors.toList());
+
+        ListObjects listObjects = new ListObjects();
+        listObjects.setObjectList(list1);
+        listObjects.setBucketName(bucket);
+        listObjects.setDelimiter(delimiter);
+        listObjects.setMaxKeys(maxKeys);
+        listObjects.setObjectSize(0L);
+        listObjects.setTruncated(true);
+        return WebBody.success(listObjects);
+    }
+
+    @ApiOperation("创建目录")
+    @PostMapping(value = "/bucket/file/create_folder.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String createFolder(@Validated CreateFolder createFolder) {
+        String objectName = createFolder.getObjectName();
+        List<String> objectNames = new ArrayList<>();
+        String[] names = objectName.split("/");
+        for (int i = 0; i < names.length; i++) {
+            if (i == 0) {
+                objectNames.add(names[i] + "/");
+            } else {
+                String tmp = objectNames.get(i-1) + names[i] + "/";
+                objectNames.add(tmp);
+            }
+        }
+
+        FileMeta fileMeta;
+        int i = 0;
+        for (; i < objectNames.size(); i++) {
+            fileMeta = fileMetaMapper.findByObjectName(objectNames.get(i));
+            if (fileMeta == null) {
+                break;
+            }
+        }
+
+        List<FileMeta> list = new ArrayList<>();
+        for (int j = i; j < objectNames.size(); j++) {
+            String objectName1 = objectNames.get(j);
+            String objectId = objectIdGenerator.stringId();
+            String[] names1 = objectName1.split("/");
+            String filename = names1[names1.length-1];
+            list.add(new FileMeta(objectName1, objectId, filename, "tnb"));
+        }
+
+        if (!list.isEmpty()) {
+            fileMetaMapper.saveAll(list);
+        }
+        return WebBody.success();
+    }
+
+    @ApiOperation("获取域名列表")
+    @GetMapping(value = "/bucket/domain/list.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String domainList() {
+        return WebBody.success();
+    }
+
+    @ApiOperation("获取 bucket ACL")
+    @GetMapping(value = "/bucket/acl.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String bucketAcl() {
+        return WebBody.success();
+    }
+
+    @ApiOperation("获取对象 ACL")
+    @GetMapping(value = "/bucket/file/get_object_acl.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String obejctAcl() {
+        return WebBody.success();
+    }
+
+    @ApiOperation("获取对象信息")
+    @GetMapping(value = "/bucket/file/head_object.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String headObject(@Validated HeadObject headObject) {
+        return WebBody.success();
+    }
+
+    @ApiOperation("生成带签名的 URL")
+    @PostMapping(value = "/bucket/file/generate_url_with_signed.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String generateSignedUrl(@Validated GenerateSignedUrl generateSignedUrl) {
+        String objectName = generateSignedUrl.getObjectName();
+        String url = String.format("//oss.reghao.cn/object/%s", objectName);
+        // 5 分钟后链接失效
+        long expires = System.currentTimeMillis()/1000 + 300;
+        String ossAccessId = "TMP.3KeSkQJhXm4fZNupmzTEFx8HQ7QobdYnbc4A5do6zvqDnkkHdwyKj2rvJzPCfprxBSfHM6H3tqci21rCnHwWEmVje3PHaA";
+        String signature = "C1NieNpY%2FrmgaHNM2PXTPU3Tshw%3D";
+        String param = String.format("Expires=%s&OSSAccessId=%s&Signature=%s", expires, ossAccessId, signature);
+
+        GenerateSignedUrlResult generateSignedUrlResult = new GenerateSignedUrlResult(url, param);
+        return WebBody.success(generateSignedUrlResult);
+    }
+}

+ 39 - 0
src/main/java/cn/reghao/dfs/store/oss/controller/RegionBasicJsonController.java

@@ -0,0 +1,39 @@
+package cn.reghao.dfs.store.oss.controller;
+
+import cn.reghao.dfs.store.oss.db.mapper.RegionMapper;
+import cn.reghao.dfs.store.oss.model.po.Region;
+import cn.reghao.dfs.store.oss.model.vo.KeyValue;
+import cn.reghao.jutil.jdk.result.WebBody;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 09:20:19
+ */
+@Api(tags = "地区基础操作接口")
+@RestController
+@RequestMapping("/ajax")
+public class RegionBasicJsonController {
+    private final RegionMapper regionMapper;
+
+    public RegionBasicJsonController(RegionMapper regionMapper) {
+        this.regionMapper = regionMapper;
+    }
+
+    @ApiOperation("获取地区列表")
+    @GetMapping(value = "/region/list.json", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getBucketList() {
+        List<KeyValue> list = regionMapper.findAll().stream().map(region -> {
+            return new KeyValue(region.getNameZhCn(), region.getLocation());
+        }).collect(Collectors.toList());
+        return WebBody.success(list);
+    }
+}

+ 15 - 0
src/main/java/cn/reghao/dfs/store/oss/db/mapper/BucketMapper.java

@@ -0,0 +1,15 @@
+package cn.reghao.dfs.store.oss.db.mapper;
+
+import cn.reghao.dfs.store.oss.model.po.Bucket;
+import cn.reghao.jutil.jdk.db.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 09:23:38
+ */
+@Mapper
+public interface BucketMapper extends BaseMapper<Bucket> {
+    Bucket findByName(@Param("bucketName") String bucketName);
+}

+ 15 - 0
src/main/java/cn/reghao/dfs/store/oss/db/mapper/RegionMapper.java

@@ -0,0 +1,15 @@
+package cn.reghao.dfs.store.oss.db.mapper;
+
+import cn.reghao.dfs.store.oss.model.po.Region;
+import cn.reghao.jutil.jdk.db.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 09:23:27
+ */
+@Mapper
+public interface RegionMapper extends BaseMapper<Region> {
+    Integer findIdByLocation(@Param("location") String location);
+}

+ 32 - 0
src/main/java/cn/reghao/dfs/store/oss/model/dto/json/CreateBucket.java

@@ -0,0 +1,32 @@
+package cn.reghao.dfs.store.oss.model.dto.json;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 09:09:52
+ */
+@Setter
+@Getter
+public class CreateBucket implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String umid;
+    private String token;
+    private String secToken;
+    private String collina;
+    private String region;
+    private String bucket;
+    private String storage;
+    private String acl;
+    private String dataRedundancyType;
+    private Boolean openSls;
+    private String algorithm;
+    private Boolean openHbr;
+    private String keyId;
+    private String kmsEncryptionAlgorithm;
+    private String resourceGroupId;
+}

+ 18 - 0
src/main/java/cn/reghao/dfs/store/oss/model/po/Bucket.java

@@ -0,0 +1,18 @@
+package cn.reghao.dfs.store.oss.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 09:22:20
+ */
+@Getter
+@Setter
+public class Bucket extends BaseObject<Integer> {
+    private int regionId;
+    private String name;
+    private String storage;
+    private String acl;
+}

+ 18 - 0
src/main/java/cn/reghao/dfs/store/oss/model/po/Region.java

@@ -0,0 +1,18 @@
+package cn.reghao.dfs.store.oss.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 09:22:15
+ */
+@Setter
+@Getter
+public class Region extends BaseObject<Integer> {
+    private String location;
+    private String nameZhCn;
+    private String nameEnUs;
+    private String endpoint;
+}

+ 13 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/KeyValue.java

@@ -0,0 +1,13 @@
+package cn.reghao.dfs.store.oss.model.vo;
+
+import lombok.AllArgsConstructor;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 14:15:39
+ */
+@AllArgsConstructor
+public class KeyValue {
+    private String key;
+    private String value;
+}

+ 16 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/RegionNames.java

@@ -0,0 +1,16 @@
+package cn.reghao.dfs.store.oss.model.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 09:51:16
+ */
+@Deprecated
+@Getter
+@Setter
+public class RegionNames {
+    private String enUs;
+    private String zhCn;
+}

+ 17 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/Regions.java

@@ -0,0 +1,17 @@
+package cn.reghao.dfs.store.oss.model.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 09:51:39
+ */
+@Deprecated
+@Getter
+@Setter
+public class Regions {
+    private RegionNames regionNames;
+    private String endpoint;
+    private String regionLocation;
+}

+ 14 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/json/ApplyServerSideEncryptionByDefault.java

@@ -0,0 +1,14 @@
+package cn.reghao.dfs.store.oss.model.vo.json;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 16:45:47
+ */
+@Getter
+@Setter
+public class ApplyServerSideEncryptionByDefault {
+    private String sselgorithm;
+}

+ 21 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/json/BucketDetail.java

@@ -0,0 +1,21 @@
+package cn.reghao.dfs.store.oss.model.vo.json;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 16:44:05
+ */
+@Getter
+@Setter
+public class BucketDetail {
+    private String region;
+    private String location;
+    private String name;
+    private String storageClass;
+    private Long creationDate;
+    private String extranetEndpoint;
+    private String intranetEndpoint;
+    private Owner owner;
+}

+ 22 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/json/BucketGetResult.java

@@ -0,0 +1,22 @@
+package cn.reghao.dfs.store.oss.model.vo.json;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 16:43:23
+ */
+@Getter
+@Setter
+public class BucketGetResult {
+    private BucketDetail bucket;
+    private String cannedACL;
+    private String comment;
+    private String dataRedundancyType;
+    private List<Object> grants;
+    private ServerSideEncryptionConfiguration serverSideEncryptionConfiguration;
+    private String requestId;
+}

+ 21 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/json/BucketInfo.java

@@ -0,0 +1,21 @@
+package cn.reghao.dfs.store.oss.model.vo.json;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 16:37:57
+ */
+@Getter
+@Setter
+public class BucketInfo {
+    private String region;
+    private String location;
+    private String name;
+    private String storageClass;
+    private Long creationDate;
+    private String extranetEndpoint;
+    private String intranetEndpoint;
+    private Owner owner;
+}

+ 17 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/json/BucketListResult.java

@@ -0,0 +1,17 @@
+package cn.reghao.dfs.store.oss.model.vo.json;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 16:37:43
+ */
+@Getter
+@Setter
+public class BucketListResult {
+    private List<BucketInfo> buckets;
+    private List<Object> failedRegions;
+}

+ 15 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/json/Owner.java

@@ -0,0 +1,15 @@
+package cn.reghao.dfs.store.oss.model.vo.json;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 16:37:03
+ */
+@Getter
+@Setter
+public class Owner {
+    private String id;
+    private String displayName;
+}

+ 14 - 0
src/main/java/cn/reghao/dfs/store/oss/model/vo/json/ServerSideEncryptionConfiguration.java

@@ -0,0 +1,14 @@
+package cn.reghao.dfs.store.oss.model.vo.json;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2023-01-05 16:45:38
+ */
+@Getter
+@Setter
+public class ServerSideEncryptionConfiguration {
+    private ApplyServerSideEncryptionByDefault applyServerSideEncryptionByDefault;
+}

+ 19 - 0
src/main/resources/mapper/oss/BucketMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.reghao.dfs.store.oss.db.mapper.BucketMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into bucket
+        (`id`,`deleted`,`create_time`,`update_time`,`region_id`,`name`,`storage`,`acl`)
+        values
+        (#{id},#{deleted},#{createTime},#{updateTime},#{regionId},#{name},#{storage},#{acl})
+    </insert>
+
+    <select id="findAll" resultType="cn.reghao.dfs.store.oss.model.po.Bucket">
+        select * from bucket
+    </select>
+    <select id="findByName" resultType="cn.reghao.dfs.store.oss.model.po.Bucket">
+        select * from bucket
+        where name=#{bucketName}
+    </select>
+</mapper>

+ 26 - 0
src/main/resources/mapper/oss/RegionMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.reghao.dfs.store.oss.db.mapper.RegionMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into region
+        (`id`,`deleted`,`create_time`,`update_time`,`location`,`name_zh_cn`,`name_en_us`,`endpoint`)
+        values
+        (#{id},#{deleted},#{createTime},#{updateTime},#{location},#{nameZhCn},#{nameEnUs},#{endpoint})
+    </insert>
+    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
+        insert into region
+        (`id`,`deleted`,`create_time`,`update_time`,`location`,`name_zh_cn`,`name_en_us`,`endpoint`)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.id},#{item.deleted},#{item.createTime},#{item.updateTime},#{item.location},#{item.nameZhCn},#{item.nameEnUs},#{item.endpoint})
+        </foreach>
+    </insert>
+
+    <select id="findAll" resultType="cn.reghao.dfs.store.oss.model.po.Region">
+        select * from region
+    </select>
+    <select id="findIdByLocation" resultType="java.lang.Integer">
+        select * from region where location=#{location}
+    </select>
+</mapper>