From adbb9f1dfa02deddd34dd32e0ebf46a341bff3a4 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Thu, 21 Dec 2023 10:24:00 +0800 Subject: [PATCH 01/39] =?UTF-8?q?feat(icon=5Fmanage):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E5=92=8C=E5=9B=BE=E6=A0=87=E7=BB=84=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/icon/annotation/IsJsonString.java | 38 +++++ .../icon/controller/IconDetailController.java | 83 ++++++++++ .../icon/controller/IconGroupController.java | 84 ++++++++++ .../oss/client/icon/entity/IconDetail.java | 99 ++++++++++++ .../oss/client/icon/entity/IconGroup.java | 73 +++++++++ .../client/icon/mapper/IconDetailMapper.java | 16 ++ .../client/icon/mapper/IconGroupMapper.java | 16 ++ .../cn/axzo/oss/client/icon/package-info.java | 8 + .../icon/repository/IconDetailRepository.java | 16 ++ .../icon/repository/IconGroupRepository.java | 15 ++ .../icon/service/IconDetailService.java | 50 ++++++ .../client/icon/service/IconGroupService.java | 48 ++++++ .../service/impl/IconDetailServiceImpl.java | 145 ++++++++++++++++++ .../service/impl/IconGroupServiceImpl.java | 124 +++++++++++++++ .../icon/validator/JsonStringValidator.java | 37 +++++ .../icon/vo/request/IconDetailAddReq.java | 71 +++++++++ .../icon/vo/request/IconDetailListReq.java | 40 +++++ .../icon/vo/request/IconDetailUpdateReq.java | 47 ++++++ .../vo/request/IconDetailUpdateStatus.java | 32 ++++ .../icon/vo/request/IconGroupAddReq.java | 40 +++++ .../icon/vo/request/IconGroupListReq.java | 35 +++++ .../icon/vo/request/IconGroupUpdateReq.java | 38 +++++ .../vo/request/IconGroupUpdateStatusReq.java | 32 ++++ .../icon/vo/response/IconDetailListResp.java | 87 +++++++++++ .../icon/vo/response/IconGroupListResp.java | 52 +++++++ oss-client/src/main/resources/bootstrap.yml | 4 +- .../cn/axzo/oss/common/enums/CodeEnum.java | 6 +- 27 files changed, 1333 insertions(+), 3 deletions(-) create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/annotation/IsJsonString.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconGroupController.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconGroup.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/mapper/IconDetailMapper.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/mapper/IconGroupMapper.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/package-info.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/repository/IconDetailRepository.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/repository/IconGroupRepository.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconGroupService.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/validator/JsonStringValidator.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailListReq.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateReq.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateStatus.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupAddReq.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupListReq.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateReq.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateStatusReq.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconGroupListResp.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/annotation/IsJsonString.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/annotation/IsJsonString.java new file mode 100644 index 0000000..a5c5d17 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/annotation/IsJsonString.java @@ -0,0 +1,38 @@ +package cn.axzo.oss.client.icon.annotation; + +import cn.axzo.oss.client.icon.validator.JsonStringValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解,用于判断是否是json字符串 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:49 + */ +@Documented +@Constraint(validatedBy = JsonStringValidator.class) +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface IsJsonString { + + /** + * 是否允许为空,默认允许 + * + * @return true/false + */ + boolean allowBlank() default true; + + String message() default "Invalid json string"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java new file mode 100644 index 0000000..56eb5ff --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java @@ -0,0 +1,83 @@ +package cn.axzo.oss.client.icon.controller; + +import cn.axzo.oss.client.icon.service.IconDetailService; +import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq; +import cn.axzo.oss.client.icon.vo.request.IconDetailListReq; +import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq; +import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateStatus; +import cn.axzo.oss.client.icon.vo.response.IconDetailListResp; +import cn.azxo.framework.common.model.CommonResponse; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 图标详情 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:25 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/icon") +public class IconDetailController { + + private final IconDetailService iconDetailService; + + /** + * 新增图标 + * + * @param req 图标信息 {@link IconDetailAddReq} + * @return true:成功 false:失败 + */ + @PostMapping("/add") + public CommonResponse add(@RequestBody @Validated IconDetailAddReq req) { + log.info("图标详情:req = {}", JSONUtil.toJsonStr(req)); + return CommonResponse.success(iconDetailService.add(req)); + } + + /** + * 更新图标信息 + * + * @param req 图标信息 {@link IconDetailUpdateReq} + * @return true:成功 false:失败 + */ + @PostMapping("/update") + public CommonResponse update(@RequestBody @Validated IconDetailUpdateReq req) { + log.info("更新图标信息:req = {}", JSONUtil.toJsonStr(req)); + return CommonResponse.success(iconDetailService.update(req)); + } + + /** + * 更新图标状态 + * + * @param req 图标信息 {@link IconDetailUpdateStatus} + * @return true:成功 false:失败 + */ + @PostMapping("/updateStatus") + public CommonResponse updateStatus(@RequestBody @Validated IconDetailUpdateStatus req) { + log.info("更新图标状态:req = {}", JSONUtil.toJsonStr(req)); + return CommonResponse.success(iconDetailService.updateStatus(req.getId(), req.getStatus())); + } + + /** + * 图标列表 + * + * @param req 图标信息 {@link IconDetailListReq} + * @return 图标列表,按创建时间倒序 {@link IconDetailListResp} + */ + @GetMapping("/list") + public CommonResponse> list(@RequestBody IconDetailListReq req) { + return CommonResponse.success(iconDetailService.list(req)); + } +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconGroupController.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconGroupController.java new file mode 100644 index 0000000..de81679 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconGroupController.java @@ -0,0 +1,84 @@ +package cn.axzo.oss.client.icon.controller; + +import cn.axzo.oss.client.icon.service.IconGroupService; +import cn.axzo.oss.client.icon.vo.request.IconGroupAddReq; +import cn.axzo.oss.client.icon.vo.request.IconGroupListReq; +import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateReq; +import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateStatusReq; +import cn.axzo.oss.client.icon.vo.response.IconGroupListResp; +import cn.azxo.framework.common.model.CommonResponse; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 图标组管理 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:27 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/icon/group") +public class IconGroupController { + + private final IconGroupService iconGroupService; + + /** + * 新增图标组 + * + * @param req 图标组信息 {@link IconGroupAddReq} + * @return 响应结果,成功返回true,失败返回false + */ + @PostMapping("/add") + public CommonResponse add(@RequestBody @Validated IconGroupAddReq req) { + log.info("新增图标组:req = {}", JSONUtil.toJsonStr(req)); + return CommonResponse.success(iconGroupService.add(req)); + } + + /** + * 更新图标组信息 + * + * @param req 图标组信息 {@link IconGroupUpdateReq} + * @return 响应结果,成功返回true,失败返回false + */ + @PostMapping("/update") + public CommonResponse update(@RequestBody @Validated IconGroupUpdateReq req) { + log.info("更新图标组信息:req = {}", JSONUtil.toJsonStr(req)); + return CommonResponse.success(iconGroupService.update(req)); + } + + /** + * 编辑图标组状态,同时将该组下所有图标状态更新 + * + * @param req 图标组信息 {@link IconGroupUpdateStatusReq} + * @return 响应结果,成功返回true,失败返回false + */ + @PostMapping("/updateStatus") + public CommonResponse updateStatus(@RequestBody @Validated IconGroupUpdateStatusReq req) { + log.info("更新图标组状态:id = {},status = {}", req.getId(), req.getStatus()); + return CommonResponse.success(iconGroupService.updateStatus(req.getId(), req.getStatus())); + } + + /** + * 获取图标组列表 + * + * @param req 图标组列表查询条件 {@link IconGroupListReq} + * @return 图标组列表,按创建时间倒序 {@link IconGroupListResp} + */ + @PostMapping("/list") + public CommonResponse> list(@RequestBody IconGroupListReq req) { + log.info("获取图标组列表:req = {}", JSONUtil.toJsonStr(req)); + return CommonResponse.success(iconGroupService.list(req)); + } +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java new file mode 100644 index 0000000..9a1fe4e --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java @@ -0,0 +1,99 @@ +package cn.axzo.oss.client.icon.entity; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 图标详情 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 15:58 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@TableName("icon_detail") +public class IconDetail extends Model { + + /** + * 主键 + */ + @TableField("id") + private Long id; + + /** + * 图标组ID + */ + @TableField("group_id") + private Long groupId; + + /** + * 图标名称 + */ + @TableField("name") + private String name; + + /** + * 图标地址 + */ + @TableField("url") + private String url; + + /** + * 图标存储大小,单位KB + */ + @TableField("size") + private Double size; + + /** + * 尺寸-宽,单位mm + */ + @TableField("weight") + private Integer weight; + + /** + * 尺寸-高,单位mm + */ + @TableField("height") + private Integer height; + + /** + * 图标状态,0-未使用,1-使用中,2-已弃用,默认0 + */ + @TableField("status") + private Integer status; + + /** + * 扩展信息(json) + */ + @TableField("ext") + private String ext; + + /** + * 是否删除(0:未删除;1:已删除) + */ + @TableField("is_delete") + private Integer isDelete; + + /** + * 创建时间 + */ + @TableField("create_at") + private Date createAt; + + /** + * 修改时间 + */ + @TableField("update_at") + private Date updateAt; + +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconGroup.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconGroup.java new file mode 100644 index 0000000..45bd73d --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconGroup.java @@ -0,0 +1,73 @@ +package cn.axzo.oss.client.icon.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 图标组 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:11 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("icon_group") +public class IconGroup extends Model { + + /** + * 主键 + */ + @TableField("id") + private Long id; + + /** + * 终端,例如pc,h5 + */ + @TableField("terminal") + private String terminal; + + /** + * 图标组,例如cms,oms,cmp + */ + @TableField("group") + private String group; + + /** + * 图标组状态,0-未使用,1-使用中,2-已弃用,默认0 + */ + @TableField("status") + private Integer status; + + /** + * 扩展信息(json) + */ + @TableField("ext") + private String ext; + + /** + * 是否删除(0:未删除;1:已删除) + */ + @TableField("is_delete") + private Integer isDelete; + + /** + * 创建时间 + */ + @TableField("create_at") + private Date createAt; + + /** + * 修改时间 + */ + @TableField("update_at") + private Date updateAt; + +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/mapper/IconDetailMapper.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/mapper/IconDetailMapper.java new file mode 100644 index 0000000..d256a33 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/mapper/IconDetailMapper.java @@ -0,0 +1,16 @@ +package cn.axzo.oss.client.icon.mapper; + +import cn.axzo.oss.client.icon.entity.IconDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 图标详情Mapper + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:16 + */ +@Mapper +public interface IconDetailMapper extends BaseMapper { +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/mapper/IconGroupMapper.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/mapper/IconGroupMapper.java new file mode 100644 index 0000000..9ecd139 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/mapper/IconGroupMapper.java @@ -0,0 +1,16 @@ +package cn.axzo.oss.client.icon.mapper; + +import cn.axzo.oss.client.icon.entity.IconGroup; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 图标分组Mapper + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:18 + */ +@Mapper +public interface IconGroupMapper extends BaseMapper { +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/package-info.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/package-info.java new file mode 100644 index 0000000..e8b6da7 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/package-info.java @@ -0,0 +1,8 @@ +/** + * axzo图标管理 + * + * @author chenwenjian + * @date 2023/12/19 15:57 + * @version 1.0 + */ +package cn.axzo.oss.client.icon; \ No newline at end of file diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/repository/IconDetailRepository.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/repository/IconDetailRepository.java new file mode 100644 index 0000000..2343a42 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/repository/IconDetailRepository.java @@ -0,0 +1,16 @@ +package cn.axzo.oss.client.icon.repository; + +import cn.axzo.oss.client.icon.entity.IconDetail; +import cn.axzo.oss.client.icon.mapper.IconDetailMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Repository; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:19 + */ +@Repository +public class IconDetailRepository extends ServiceImpl { + +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/repository/IconGroupRepository.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/repository/IconGroupRepository.java new file mode 100644 index 0000000..844ee84 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/repository/IconGroupRepository.java @@ -0,0 +1,15 @@ +package cn.axzo.oss.client.icon.repository; + +import cn.axzo.oss.client.icon.entity.IconGroup; +import cn.axzo.oss.client.icon.mapper.IconGroupMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Repository; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:23 + */ +@Repository +public class IconGroupRepository extends ServiceImpl { +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java new file mode 100644 index 0000000..87f90b7 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java @@ -0,0 +1,50 @@ +package cn.axzo.oss.client.icon.service; + +import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq; +import cn.axzo.oss.client.icon.vo.request.IconDetailListReq; +import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq; +import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateStatus; +import cn.axzo.oss.client.icon.vo.response.IconDetailListResp; + +import java.util.List; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:24 + */ +public interface IconDetailService { + + /** + * 新增图标 + * + * @param req 图标信息 {@link IconDetailAddReq} + * @return true:成功 false:失败 + */ + Boolean add(IconDetailAddReq req); + + /** + * 更新图标信息 + * + * @param req 图标信息 {@link IconDetailUpdateReq} + * @return true:成功 false:失败 + */ + Boolean update(IconDetailUpdateReq req); + + /** + * 更新图标状态 + * + * @param id 图标id + * @param status 状态 + * @return true:成功 false:失败 + */ + Boolean updateStatus(Long id, Integer status); + + /** + * 图标列表 + * + * @param req 图标列表请求 {@link IconDetailListReq} + * @return 图标列表 + */ + List list(IconDetailListReq req); +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconGroupService.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconGroupService.java new file mode 100644 index 0000000..49b587f --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconGroupService.java @@ -0,0 +1,48 @@ +package cn.axzo.oss.client.icon.service; + +import cn.axzo.oss.client.icon.vo.request.IconGroupAddReq; +import cn.axzo.oss.client.icon.vo.request.IconGroupListReq; +import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateReq; +import cn.axzo.oss.client.icon.vo.response.IconGroupListResp; + +import java.util.List; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:23 + */ +public interface IconGroupService { + + /** + * 添加图标组 + * + * @param req 图标组信息 {@link IconGroupAddReq} + * @return true:添加成功 false:添加失败 + */ + Boolean add(IconGroupAddReq req); + + /** + * 修改图标组信息 + * + * @param req 图标组信息 {@link IconGroupUpdateReq} + * @return true:修改成功 false:修改失败 + */ + Boolean update(IconGroupUpdateReq req); + + /** + * 修改图标组状态 + * + * @param id 图标组id + * @param status 状态:0-未使用,1-使用中,2-已弃用 + * @return true:修改成功 false:修改失败 + */ + Boolean updateStatus(Long id, Integer status); + + /** + * 查询图标组列表 + * + * @return 图标组列表 {@link IconGroupListResp} + */ + List list(IconGroupListReq req); +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java new file mode 100644 index 0000000..8b5e311 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java @@ -0,0 +1,145 @@ +package cn.axzo.oss.client.icon.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.oss.client.icon.entity.IconDetail; +import cn.axzo.oss.client.icon.entity.IconGroup; +import cn.axzo.oss.client.icon.mapper.IconDetailMapper; +import cn.axzo.oss.client.icon.repository.IconDetailRepository; +import cn.axzo.oss.client.icon.repository.IconGroupRepository; +import cn.axzo.oss.client.icon.service.IconDetailService; +import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq; +import cn.axzo.oss.client.icon.vo.request.IconDetailListReq; +import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq; +import cn.axzo.oss.client.icon.vo.response.IconDetailListResp; +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:25 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class IconDetailServiceImpl implements IconDetailService { + + private final IconGroupRepository iconGroupRepository; + + private final IconDetailRepository iconDetailRepository; + + /** + * 新增图标 + * + * @param req 图标信息 {@link IconDetailAddReq} + * @return true:成功 false:失败 + */ + @Override + public Boolean add(IconDetailAddReq req) { + IconDetail iconDetail = iconDetailRepository.lambdaQuery() + .eq(IconDetail::getGroupId, req.getGroupId()) + .eq(IconDetail::getName, req.getName()) + .eq(IconDetail::getIsDelete, 0) + .apply("limit 1") + .one(); + // 存在 + BizException.error(Objects.isNull(iconDetail), CodeEnum.ICON_EXIST); + return iconDetailRepository.save(BeanMapper.copyBean(req, IconDetail.class)); + } + + /** + * 修改图标 + * + * @param req 图标信息 {@link IconDetailUpdateReq} + * @return true:成功 false:失败 + */ + @Override + public Boolean update(IconDetailUpdateReq req) { + IconDetail iconDetail = iconDetailRepository.getById(req.getId()); + if (Objects.isNull(iconDetail)) { + return true; + } + return iconDetailRepository.lambdaUpdate() + .eq(IconDetail::getId, req.getId()) + .set(IconDetail::getGroupId, req.getGroupId()) + .set(IconDetail::getName, req.getName()) + .set(IconDetail::getExt, req.getExt()) + .update(); + } + + /** + * 修改图标状态 + * + * @param id 图标id + * @param status 状态 + * @return true:成功 false:失败 + */ + @Override + public Boolean updateStatus(Long id, Integer status) { + IconDetail iconDetail = iconDetailRepository.getById(id); + if (Objects.isNull(iconDetail)) { + return true; + } + // 状态未变则不修改 + if (Objects.equals(iconDetail.getStatus(), status)) { + return true; + } + // 修改状态 + iconDetail.setStatus(status); + return iconDetailRepository.updateById(iconDetail); + } + + /** + * 图标列表 + * + * @param req 图标列表查询参数 {@link IconDetailListReq} + * @return 图标列表 {@link IconDetailListResp} + */ + @Override + public List list(IconDetailListReq req) { + // 查询图标列表 + List iconDetailList = iconDetailRepository.lambdaQuery() + .eq(IconDetail::getIsDelete, 0) + .in(!CollectionUtils.isEmpty(req.getGroupIds()), IconDetail::getGroupId, req.getGroupIds()) + .in(!CollectionUtils.isEmpty(req.getIds()), IconDetail::getId, req.getIds()) + .like(StringUtils.hasText(req.getName()), IconDetail::getName, req) + .in(!CollectionUtils.isEmpty(req.getStatuses()), IconDetail::getStatus, req.getStatuses()) + .orderByDesc(IconDetail::getCreateAt) + .list(); + if (CollectionUtils.isEmpty(iconDetailList)) { + return Collections.emptyList(); + } + + List groupIds = iconDetailList.stream() + .mapToLong(IconDetail::getGroupId) + .distinct() + .boxed() + .collect(Collectors.toList()); + + // 查询分组信息 + List iconGroups = iconGroupRepository.listByIds(groupIds); + BizException.error(!CollectionUtils.isEmpty(iconGroups), 500, "数据异常"); + + Map groupMap = iconGroups.stream().collect(Collectors.toMap(IconGroup::getId, Function.identity())); + + return BeanMapper.copyList(iconDetailList, IconDetailListResp.class, (iconDetail, iconDetailListResp) -> { + iconDetailListResp.setTerminal(groupMap.get(iconDetail.getGroupId()).getTerminal()); + iconDetailListResp.setGroupName(groupMap.get(iconDetail.getGroupId()).getGroup()); + }); + } +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java new file mode 100644 index 0000000..5455484 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java @@ -0,0 +1,124 @@ +package cn.axzo.oss.client.icon.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.oss.client.icon.entity.IconDetail; +import cn.axzo.oss.client.icon.entity.IconGroup; +import cn.axzo.oss.client.icon.repository.IconDetailRepository; +import cn.axzo.oss.client.icon.repository.IconGroupRepository; +import cn.axzo.oss.client.icon.service.IconGroupService; +import cn.axzo.oss.client.icon.vo.request.IconGroupAddReq; +import cn.axzo.oss.client.icon.vo.request.IconGroupListReq; +import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateReq; +import cn.axzo.oss.client.icon.vo.response.IconGroupListResp; +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:24 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class IconGroupServiceImpl implements IconGroupService { + + private final IconGroupRepository iconGroupRepository; + + private final IconDetailRepository iconDetailRepository; + + /** + * 新增图标组 + * + * @param req 图标组信息 + * @return true:添加成功 false:添加失败 + */ + @Override + public Boolean add(IconGroupAddReq req) { + // 检查该图标组是否已存在 + IconGroup iconGroup = iconGroupRepository.lambdaQuery() + .eq(IconGroup::getTerminal, req.getTerminal()) + .eq(IconGroup::getGroup, req.getGroup()) + .eq(IconGroup::getIsDelete, 0) + .apply("limit 1") + .one(); + // 存在 + BizException.error(Objects.isNull(iconGroup), CodeEnum.ICON_GROUP_EXIST); + return iconGroupRepository.save(BeanMapper.copyBean(req, IconGroup.class)); + } + + /** + * 修改图标组信息 + * + * @param req 图标组信息 + * @return true:修改成功 false:修改失败 + */ + @Override + public Boolean update(IconGroupUpdateReq req) { + // 查询图标组信息 + IconGroup iconGroup = iconGroupRepository.getById(req.getId()); + if (Objects.isNull(iconGroup)) { + return true; + } + return iconGroupRepository.lambdaUpdate() + .eq(IconGroup::getId, req.getId()) + .set(IconGroup::getGroup, req.getGroup()) + .set(IconGroup::getExt, req.getExt()) + .update(); + } + + /** + * 修改图标组状态 + * + * @param id 图标组id + * @param status 状态:0-未使用,1-使用中,2-已弃用 + * @return true:修改成功 false:修改失败 + */ + @Override + @Transactional + public Boolean updateStatus(Long id, Integer status) { + // 查询图标组信息 + IconGroup iconGroup = iconGroupRepository.getById(id); + if (Objects.isNull(iconGroup)) { + return true; + } + // 状态未变则不修改 + if (Objects.equals(iconGroup.getStatus(), status)) { + return true; + } + // 修改状态,并修改该图标组下所有图标的状态 + iconGroup.setStatus(status); + iconDetailRepository.lambdaUpdate() + .eq(IconDetail::getGroupId, iconGroup.getId()) + .eq(IconDetail::getIsDelete, 0) + .set(IconDetail::getStatus, status) + .update(); + return iconGroupRepository.updateById(iconGroup); + } + + /** + * 查询图标组列表 + * + * @param req 图标组列表条件 + * @return 图标组列表 + */ + @Override + public List list(IconGroupListReq req) { + List iconGroups = iconGroupRepository.lambdaQuery() + .eq(IconGroup::getIsDelete, 0) + .in(!CollectionUtils.isEmpty(req.getTerminals()), IconGroup::getTerminal, req.getTerminals()) + .in(!CollectionUtils.isEmpty(req.getGroups()), IconGroup::getGroup, req.getGroups()) + .in(CollectionUtils.isEmpty(req.getStatuses()), IconGroup::getStatus, req.getStatuses()) + .orderByDesc(IconGroup::getCreateAt) + .list(); + return BeanMapper.copyList(iconGroups, IconGroupListResp.class); + } +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/validator/JsonStringValidator.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/validator/JsonStringValidator.java new file mode 100644 index 0000000..f8500b1 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/validator/JsonStringValidator.java @@ -0,0 +1,37 @@ +package cn.axzo.oss.client.icon.validator; + +import cn.axzo.oss.client.icon.annotation.IsJsonString; +import com.alibaba.fastjson.JSON; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * json字符串校验器 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:55 + */ +public class JsonStringValidator implements ConstraintValidator { + + private boolean allowBlank = true; + + @Override + public void initialize(IsJsonString constraintAnnotation) { + allowBlank = constraintAnnotation.allowBlank(); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (value == null || value.isEmpty()) { + return allowBlank; + } + try { + Object o = JSON.parse(value); + return true; + } catch (Exception e) { + return false; + } + } +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java new file mode 100644 index 0000000..5139831 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java @@ -0,0 +1,71 @@ +package cn.axzo.oss.client.icon.vo.request; + +import cn.axzo.oss.client.icon.annotation.IsJsonString; +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/20 17:32 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconDetailAddReq { + + /** + * 图标组ID + */ + @NotNull(message = "图标组id不能为空") + private Long groupId; + + /** + * 图标名称 + */ + @NotBlank(message = "图标名称不能为空") + private String name; + + /** + * 图标地址 + */ + @NotBlank(message = "图标地址不能为空") + private String url; + + /** + * 图标存储大小,单位KB + */ + @Min(value = 0, message = "图标存储大小不能小于0") + @NotNull(message = "图标存储大小不能为空") + private Double size; + + /** + * 尺寸-宽,单位mm@ + */ + @Min(value = 0, message = "图标宽度不能小于0") + @NotNull(message = "图标宽度不能为空") + private Integer weight; + + /** + * 尺寸-高,单位mm + */ + @Min(value = 0, message = "图标高度不能小于0") + @NotNull(message = "图标高度不能为空") + private Integer height; + + /** + * 扩展信息(json) + */ + @IsJsonString(message = "扩展信息格式不正确") + private String ext; + +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailListReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailListReq.java new file mode 100644 index 0000000..fe3cbc1 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailListReq.java @@ -0,0 +1,40 @@ +package cn.axzo.oss.client.icon.vo.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/20 19:54 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconDetailListReq { + + /** + * 图标ID,多个用逗号分隔 + */ + private List ids; + + /** + * 分组ID,多个用逗号分隔 + */ + private List groupIds; + + /** + * 名称,模糊查询 + */ + private String name; + + /** + * 状态,0:正常,1:禁用,多个用逗号分隔 + */ + private List statuses; +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateReq.java new file mode 100644 index 0000000..6692cda --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateReq.java @@ -0,0 +1,47 @@ +package cn.axzo.oss.client.icon.vo.request; + +import cn.axzo.oss.client.icon.annotation.IsJsonString; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/20 18:11 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconDetailUpdateReq { + + /** + * 图标ID + */ + @NotNull(message = "图标id不能为空") + private Long id; + + /** + * 图标组ID + */ + @NotNull(message = "图标组id不能为空") + private Long groupId; + + /** + * 图标名称 + */ + @NotBlank(message = "图标名称不能为空") + private String name; + + /** + * 扩展信息(json) + */ + @IsJsonString(message = "扩展信息格式不正确") + private String ext; +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateStatus.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateStatus.java new file mode 100644 index 0000000..08b7f62 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateStatus.java @@ -0,0 +1,32 @@ +package cn.axzo.oss.client.icon.vo.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/20 18:22 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconDetailUpdateStatus { + + /** + * 图标id + */ + @NotNull(message = "图标id不能为空") + private Long id; + + /** + * 图标状态,状态:0-未使用,1-使用中,2-已弃用 + */ + @NotNull(message = "图标状态不能为空") + private Integer status; +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupAddReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupAddReq.java new file mode 100644 index 0000000..b1a7412 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupAddReq.java @@ -0,0 +1,40 @@ +package cn.axzo.oss.client.icon.vo.request; + +import cn.axzo.oss.client.icon.annotation.IsJsonString; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:37 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconGroupAddReq { + + /** + * 终端,例如pc,h5 + */ + @NotBlank(message = "段类型不能为空") + private String terminal; + + /** + * 图标组,例如cms,oms,cmp + */ + @NotBlank(message = "图标组不能为空") + private String group; + + /** + * 扩展信息(json) + */ + @IsJsonString(message = "扩展信息格式不正确") + private String ext; + +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupListReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupListReq.java new file mode 100644 index 0000000..261567d --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupListReq.java @@ -0,0 +1,35 @@ +package cn.axzo.oss.client.icon.vo.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/20 18:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconGroupListReq { + + /** + * 终端,pc,h5,多个用逗号分隔 + */ + List terminals; + + /** + * 图标组, 多个用逗号分隔 + */ + List groups; + + /** + * 状态,0:正常,1:禁用,多个用逗号分隔 + */ + List statuses; +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateReq.java new file mode 100644 index 0000000..c17677e --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateReq.java @@ -0,0 +1,38 @@ +package cn.axzo.oss.client.icon.vo.request; + +import cn.axzo.oss.client.icon.annotation.IsJsonString; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/20 17:08 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconGroupUpdateReq { + + /** + * 图标组id + */ + private Long id; + + /** + * 图标组,例如cms,oms,cmp + */ + @NotBlank(message = "图标组名不能为空") + private String group; + + /** + * 扩展信息(json) + */ + @IsJsonString(message = "扩展信息格式不正确") + private String ext; +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateStatusReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateStatusReq.java new file mode 100644 index 0000000..5171a4a --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateStatusReq.java @@ -0,0 +1,32 @@ +package cn.axzo.oss.client.icon.vo.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/20 16:56 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconGroupUpdateStatusReq { + + /** + * 图标组id + */ + @NotNull(message = "图标组id不能为空") + private Long id; + + /** + * 图标组状态,状态:0-未使用,1-使用中,2-已弃用 + */ + @NotNull(message = "图标组状态不能为空") + private Integer status; +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java new file mode 100644 index 0000000..74c05a5 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java @@ -0,0 +1,87 @@ +package cn.axzo.oss.client.icon.vo.response; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/20 19:59 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconDetailListResp { + + /** + * 主键 + */ + private Long id; + + /** + * 终端,例如pc,h5 + */ + private String terminal; + + /** + * 图标组ID + */ + private Long groupId; + + /** + * 图标组名称 + */ + private String groupName; + + /** + * 图标名称 + */ + private String name; + + /** + * 图标地址 + */ + private String url; + + /** + * 图标存储大小,单位KB + */ + private Double size; + + /** + * 尺寸-宽,单位mm + */ + private Integer weight; + + /** + * 尺寸-高,单位mm + */ + private Integer height; + + /** + * 图标状态,0-未使用,1-使用中,2-已弃用,默认0 + */ + private Integer status; + + /** + * 扩展信息(json) + */ + private String ext; + + /** + * 创建时间 + */ + private Date createAt; + + /** + * 修改时间 + */ + private Date updateAt; + +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconGroupListResp.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconGroupListResp.java new file mode 100644 index 0000000..bf4477d --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconGroupListResp.java @@ -0,0 +1,52 @@ +package cn.axzo.oss.client.icon.vo.response; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/19 17:30 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconGroupListResp { + + /** + * 主键 + */ + private Long id; + + /** + * 终端,例如pc,h5 + */ + private String terminal; + + /** + * 图标组,例如cms,oms,cmp + */ + private String group; + + /** + * 扩展信息(json) + */ + private String ext; + + /** + * 创建时间 + */ + private Date createAt; + + /** + * 修改时间 + */ + private Date updateAt; + +} diff --git a/oss-client/src/main/resources/bootstrap.yml b/oss-client/src/main/resources/bootstrap.yml index 579e4c7..1ece507 100644 --- a/oss-client/src/main/resources/bootstrap.yml +++ b/oss-client/src/main/resources/bootstrap.yml @@ -4,12 +4,12 @@ spring: cloud: nacos: config: - server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} + server-addr: ${NACOS_HOST:https://dev-nacos.axzo.cn}:${NACOS_PORT:443} file-extension: yaml namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7} prefix: ${spring.application.name} profiles: - active: ${NACOS_PROFILES_ACTIVE:local} + active: ${NACOS_PROFILES_ACTIVE:dev} main: allow-bean-definition-overriding: true diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java index 61684f2..a52c44b 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java @@ -46,7 +46,11 @@ public enum CodeEnum implements EnumBase { FILE_NOT_FOUND(112, "文件不存在"), MULTIPART_UPLOAD_INIT_ERROR(113, "文件类型初始化失败"), MULTIPART_UPLOAD_ERROR(114, "文件上传失败"), - MULTIPART_UPLOAD_COMPLETE_ERROR(115, "文件上传失败") + MULTIPART_UPLOAD_COMPLETE_ERROR(115, "文件上传失败"), + + ICON_GROUP_EXIST(116, "图标组已存在"), + ICON_EXIST(117, "图标已存在") + ; From 8accefb74c8c13bb33819e820764a6a02657fd03 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Thu, 21 Dec 2023 17:14:27 +0800 Subject: [PATCH 02/39] =?UTF-8?q?feat(icon=5Fmanage):=20=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/client/Bootstrap.java | 2 +- .../icon/controller/IconDetailController.java | 16 +++++- .../icon/controller/IconGroupController.java | 15 +++++ .../oss/client/icon/entity/IconDetail.java | 11 ++-- .../oss/client/icon/entity/IconGroup.java | 16 ++++-- .../icon/service/IconDetailService.java | 8 +++ .../client/icon/service/IconGroupService.java | 8 +++ .../service/impl/IconDetailServiceImpl.java | 56 +++++++++++++++++-- .../service/impl/IconGroupServiceImpl.java | 21 +++++-- .../icon/vo/request/IconDetailAddReq.java | 5 +- .../icon/vo/request/IconDetailUpdateReq.java | 5 +- .../icon/vo/request/IconGroupAddReq.java | 4 +- .../icon/vo/request/IconGroupUpdateReq.java | 6 +- .../icon/vo/response/IconDetailListResp.java | 1 + .../icon/vo/response/IconGroupListResp.java | 1 + .../cn/axzo/oss/common/enums/CodeEnum.java | 3 +- 16 files changed, 149 insertions(+), 29 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java index 3776998..9e9d26d 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -14,7 +14,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; * @since 2021-07-15 11:34 */ @Slf4j -@MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) +@MapperScan(basePackages = {"cn.axzo.oss.dal.mapper", "cn.axzo.oss.client.icon.mapper"}) @EnableFeignClients(basePackages = {"cn.axzo.log.platform.client"}) @SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) public class Bootstrap { diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java index 56eb5ff..59089ab 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java @@ -15,8 +15,10 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import javax.validation.constraints.NotNull; import java.util.List; /** @@ -46,6 +48,18 @@ public class IconDetailController { return CommonResponse.success(iconDetailService.add(req)); } + /** + * 根据id查询图标详情 + * + * @param id 图标id + * @return 图标详情 + */ + @GetMapping("/detailById") + public CommonResponse detailById(@RequestParam("id") @NotNull(message = "图标id不能为空") Long id) { + log.info("图标详情:id = {}", id); + return CommonResponse.success(iconDetailService.detailById(id)); + } + /** * 更新图标信息 * @@ -76,7 +90,7 @@ public class IconDetailController { * @param req 图标信息 {@link IconDetailListReq} * @return 图标列表,按创建时间倒序 {@link IconDetailListResp} */ - @GetMapping("/list") + @PostMapping("/list") public CommonResponse> list(@RequestBody IconDetailListReq req) { return CommonResponse.success(iconDetailService.list(req)); } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconGroupController.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconGroupController.java index de81679..8de662d 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconGroupController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconGroupController.java @@ -5,6 +5,7 @@ import cn.axzo.oss.client.icon.vo.request.IconGroupAddReq; import cn.axzo.oss.client.icon.vo.request.IconGroupListReq; import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateReq; import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateStatusReq; +import cn.axzo.oss.client.icon.vo.response.IconDetailListResp; import cn.axzo.oss.client.icon.vo.response.IconGroupListResp; import cn.azxo.framework.common.model.CommonResponse; import cn.hutool.json.JSONUtil; @@ -15,8 +16,10 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import javax.validation.constraints.NotNull; import java.util.List; /** @@ -46,6 +49,18 @@ public class IconGroupController { return CommonResponse.success(iconGroupService.add(req)); } + /** + * 查询图标组详情 + * + * @param id 图标组id + * @return 图标组详情 {@link IconDetailListResp} + */ + @GetMapping("/detailById") + public CommonResponse detailById(@RequestParam("id") @NotNull(message = "图标组id不能为空") Long id) { + log.info("查询图标组详情:id = {}", id); + return CommonResponse.success(iconGroupService.detailById(id)); + } + /** * 更新图标组信息 * diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java index 9a1fe4e..8b53227 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java @@ -1,9 +1,12 @@ package cn.axzo.oss.client.icon.entity; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; @@ -21,13 +24,13 @@ import java.util.Date; @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = false) -@TableName("icon_detail") +@TableName(value = "icon_detail", autoResultMap = true) public class IconDetail extends Model { /** * 主键 */ - @TableField("id") + @TableId(value = "id", type = IdType.AUTO) private Long id; /** @@ -69,13 +72,13 @@ public class IconDetail extends Model { /** * 图标状态,0-未使用,1-使用中,2-已弃用,默认0 */ - @TableField("status") + @TableField("`status`") private Integer status; /** * 扩展信息(json) */ - @TableField("ext") + @TableField(value = "ext", typeHandler = FastjsonTypeHandler.class) private String ext; /** diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconGroup.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconGroup.java index 45bd73d..48db7e8 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconGroup.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconGroup.java @@ -1,13 +1,19 @@ package cn.axzo.oss.client.icon.entity; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.util.Date; +import java.util.Map; /** * 图标组 @@ -19,13 +25,13 @@ import java.util.Date; @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = true) -@TableName("icon_group") +@TableName(value = "icon_group", autoResultMap = true) public class IconGroup extends Model { /** * 主键 */ - @TableField("id") + @TableId(value = "id", type = IdType.AUTO) private Long id; /** @@ -37,19 +43,19 @@ public class IconGroup extends Model { /** * 图标组,例如cms,oms,cmp */ - @TableField("group") + @TableField("`group`") private String group; /** * 图标组状态,0-未使用,1-使用中,2-已弃用,默认0 */ - @TableField("status") + @TableField("`status`") private Integer status; /** * 扩展信息(json) */ - @TableField("ext") + @TableField(value = "ext", typeHandler = FastjsonTypeHandler.class) private String ext; /** diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java index 87f90b7..a653881 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java @@ -47,4 +47,12 @@ public interface IconDetailService { * @return 图标列表 */ List list(IconDetailListReq req); + + /** + * 图标详情 + * + * @param id 图标id + * @return 图标详情 + */ + IconDetailListResp detailById(Long id); } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconGroupService.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconGroupService.java index 49b587f..d7829cd 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconGroupService.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconGroupService.java @@ -45,4 +45,12 @@ public interface IconGroupService { * @return 图标组列表 {@link IconGroupListResp} */ List list(IconGroupListReq req); + + /** + * 查询图标组详情 + * + * @param id 图标组id + * @return 图标组详情 + */ + IconGroupListResp detailById(Long id); } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java index 8b5e311..4d305aa 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java @@ -13,9 +13,11 @@ import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq; import cn.axzo.oss.client.icon.vo.response.IconDetailListResp; import cn.axzo.oss.common.enums.CodeEnum; import cn.axzo.oss.common.exception.BizException; +import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -51,15 +53,24 @@ public class IconDetailServiceImpl implements IconDetailService { */ @Override public Boolean add(IconDetailAddReq req) { + // 校验图标组是否存在 + IconGroup iconGroup = iconGroupRepository.lambdaQuery() + .eq(IconGroup::getId, req.getGroupId()) + .eq(IconGroup::getIsDelete, 0) + .lt(IconGroup::getStatus, 2) + .last("limit 1") + .one(); + BizException.error(Objects.nonNull(iconGroup), CodeEnum.ICON_GROUP_NOT_EXIST); + // 校验图标是否已存在 IconDetail iconDetail = iconDetailRepository.lambdaQuery() .eq(IconDetail::getGroupId, req.getGroupId()) .eq(IconDetail::getName, req.getName()) .eq(IconDetail::getIsDelete, 0) - .apply("limit 1") + .last("limit 1") .one(); // 存在 BizException.error(Objects.isNull(iconDetail), CodeEnum.ICON_EXIST); - return iconDetailRepository.save(BeanMapper.copyBean(req, IconDetail.class)); + return iconDetailRepository.save(BeanMapper.copyBean(req, IconDetail.class, (r, i) -> i.setExt(JSONUtil.toJsonStr(r.getExt())))); } /** @@ -78,7 +89,7 @@ public class IconDetailServiceImpl implements IconDetailService { .eq(IconDetail::getId, req.getId()) .set(IconDetail::getGroupId, req.getGroupId()) .set(IconDetail::getName, req.getName()) - .set(IconDetail::getExt, req.getExt()) + .set(IconDetail::getExt, JSONUtil.toJsonStr(req.getExt())) .update(); } @@ -90,6 +101,7 @@ public class IconDetailServiceImpl implements IconDetailService { * @return true:成功 false:失败 */ @Override + @Transactional public Boolean updateStatus(Long id, Integer status) { IconDetail iconDetail = iconDetailRepository.getById(id); if (Objects.isNull(iconDetail)) { @@ -99,9 +111,23 @@ public class IconDetailServiceImpl implements IconDetailService { if (Objects.equals(iconDetail.getStatus(), status)) { return true; } - // 修改状态 + // 修改图标状态 iconDetail.setStatus(status); - return iconDetailRepository.updateById(iconDetail); + iconDetailRepository.updateById(iconDetail); + // 若修改图标状态后,该分组下所有图标均为同一状态(本次修改的目标状态),则修改图标组状态 + List iconDetailList = iconDetailRepository.lambdaQuery() + .eq(IconDetail::getIsDelete, 0) + .eq(IconDetail::getGroupId, iconDetail.getGroupId()) + .list(); + boolean allMatch = iconDetailList.stream().allMatch(iconDetail1 -> Objects.equals(iconDetail1.getStatus(), status)); + if (!allMatch) { + return true; + } + return iconGroupRepository.lambdaUpdate() + .eq(IconGroup::getIsDelete, 0) + .eq(IconGroup::getId, iconDetail.getGroupId()) + .set(IconGroup::getStatus, status) + .update(); } /** @@ -142,4 +168,24 @@ public class IconDetailServiceImpl implements IconDetailService { iconDetailListResp.setGroupName(groupMap.get(iconDetail.getGroupId()).getGroup()); }); } + + /** + * 图标详情 + * + * @param id 图标id + * @return 图标详情 {@link IconDetailListResp} + */ + @Override + public IconDetailListResp detailById(Long id) { + IconDetail iconDetail = iconDetailRepository.getById(id); + if (Objects.isNull(iconDetail)) { + return null; + } + IconGroup iconGroup = iconGroupRepository.getById(iconDetail.getGroupId()); + BizException.error(Objects.nonNull(iconGroup), 500, "数据异常"); + return BeanMapper.copyBean(iconDetail, IconDetailListResp.class, (i, r) -> { + r.setTerminal(iconGroup.getTerminal()); + r.setGroupName(iconGroup.getGroup()); + }); + } } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java index 5455484..4976190 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java @@ -12,6 +12,7 @@ import cn.axzo.oss.client.icon.vo.request.IconGroupUpdateReq; import cn.axzo.oss.client.icon.vo.response.IconGroupListResp; import cn.axzo.oss.common.enums.CodeEnum; import cn.axzo.oss.common.exception.BizException; +import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -20,6 +21,7 @@ import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Objects; +import java.util.function.BiConsumer; /** * @author chenwenjian @@ -48,11 +50,11 @@ public class IconGroupServiceImpl implements IconGroupService { .eq(IconGroup::getTerminal, req.getTerminal()) .eq(IconGroup::getGroup, req.getGroup()) .eq(IconGroup::getIsDelete, 0) - .apply("limit 1") + .last("limit 1") .one(); // 存在 BizException.error(Objects.isNull(iconGroup), CodeEnum.ICON_GROUP_EXIST); - return iconGroupRepository.save(BeanMapper.copyBean(req, IconGroup.class)); + return iconGroupRepository.save(BeanMapper.copyBean(req, IconGroup.class, (r, i) -> i.setExt(JSONUtil.toJsonStr(r.getExt())))); } /** @@ -71,7 +73,7 @@ public class IconGroupServiceImpl implements IconGroupService { return iconGroupRepository.lambdaUpdate() .eq(IconGroup::getId, req.getId()) .set(IconGroup::getGroup, req.getGroup()) - .set(IconGroup::getExt, req.getExt()) + .set(IconGroup::getExt, JSONUtil.toJsonStr(req.getExt())) .update(); } @@ -116,9 +118,20 @@ public class IconGroupServiceImpl implements IconGroupService { .eq(IconGroup::getIsDelete, 0) .in(!CollectionUtils.isEmpty(req.getTerminals()), IconGroup::getTerminal, req.getTerminals()) .in(!CollectionUtils.isEmpty(req.getGroups()), IconGroup::getGroup, req.getGroups()) - .in(CollectionUtils.isEmpty(req.getStatuses()), IconGroup::getStatus, req.getStatuses()) + .in(!CollectionUtils.isEmpty(req.getStatuses()), IconGroup::getStatus, req.getStatuses()) .orderByDesc(IconGroup::getCreateAt) .list(); return BeanMapper.copyList(iconGroups, IconGroupListResp.class); } + + /** + * 查询图标组详情 + * + * @param id 图标组id + * @return 图标组详情 + */ + @Override + public IconGroupListResp detailById(Long id) { + return BeanMapper.copyBean(iconGroupRepository.getById(id), IconGroupListResp.class); + } } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java index 5139831..bcc12d3 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java @@ -1,6 +1,7 @@ package cn.axzo.oss.client.icon.vo.request; import cn.axzo.oss.client.icon.annotation.IsJsonString; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import lombok.AllArgsConstructor; import lombok.Builder; @@ -11,6 +12,7 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.Date; +import java.util.Map; /** * @author chenwenjian @@ -65,7 +67,6 @@ public class IconDetailAddReq { /** * 扩展信息(json) */ - @IsJsonString(message = "扩展信息格式不正确") - private String ext; + private Map ext; } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateReq.java index 6692cda..4cac8b1 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateReq.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailUpdateReq.java @@ -1,6 +1,7 @@ package cn.axzo.oss.client.icon.vo.request; import cn.axzo.oss.client.icon.annotation.IsJsonString; +import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -9,6 +10,7 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.util.Map; /** * @author chenwenjian @@ -42,6 +44,5 @@ public class IconDetailUpdateReq { /** * 扩展信息(json) */ - @IsJsonString(message = "扩展信息格式不正确") - private String ext; + private Map ext; } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupAddReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupAddReq.java index b1a7412..1804303 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupAddReq.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupAddReq.java @@ -1,6 +1,7 @@ package cn.axzo.oss.client.icon.vo.request; import cn.axzo.oss.client.icon.annotation.IsJsonString; +import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -34,7 +35,6 @@ public class IconGroupAddReq { /** * 扩展信息(json) */ - @IsJsonString(message = "扩展信息格式不正确") - private String ext; + private JSONObject ext; } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateReq.java index c17677e..55e798c 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateReq.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconGroupUpdateReq.java @@ -1,12 +1,15 @@ package cn.axzo.oss.client.icon.vo.request; import cn.axzo.oss.client.icon.annotation.IsJsonString; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; +import java.util.Map; /** * @author chenwenjian @@ -33,6 +36,5 @@ public class IconGroupUpdateReq { /** * 扩展信息(json) */ - @IsJsonString(message = "扩展信息格式不正确") - private String ext; + private Map ext; } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java index 74c05a5..cb150a7 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java @@ -1,5 +1,6 @@ package cn.axzo.oss.client.icon.vo.response; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconGroupListResp.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconGroupListResp.java index bf4477d..cbf09ca 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconGroupListResp.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconGroupListResp.java @@ -1,5 +1,6 @@ package cn.axzo.oss.client.icon.vo.response; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java index a52c44b..0bd21b9 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java @@ -49,7 +49,8 @@ public enum CodeEnum implements EnumBase { MULTIPART_UPLOAD_COMPLETE_ERROR(115, "文件上传失败"), ICON_GROUP_EXIST(116, "图标组已存在"), - ICON_EXIST(117, "图标已存在") + ICON_GROUP_NOT_EXIST(117, "图标组不存在"), + ICON_EXIST(118, "图标已存在") ; From 9d2e3067fc473148d1d113c98e0fcf119916e7c9 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Tue, 26 Dec 2023 10:26:47 +0800 Subject: [PATCH 03/39] =?UTF-8?q?feat(icon=5Fmanage):=20=E5=B0=81=E8=A3=85?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E4=B8=8A=E4=BC=A0=E6=8E=A5=E5=8F=A3=EF=BC=88?= =?UTF-8?q?=E4=B8=8D=E9=89=B4=E6=9D=83=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IconFileUploadController.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconFileUploadController.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconFileUploadController.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconFileUploadController.java new file mode 100644 index 0000000..3514a5f --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconFileUploadController.java @@ -0,0 +1,69 @@ +package cn.axzo.oss.client.icon.controller; + +import cn.axzo.oss.client.vo.FileInformationVo; +import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.common.utils.BeanConvertUtil; +import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; +import cn.axzo.oss.manager.api.dto.response.FileInformationResponse; +import cn.axzo.oss.service.api.FileService; +import cn.azxo.framework.common.model.CommonResponse; +import lombok.SneakyThrows; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static cn.axzo.oss.common.enums.CodeEnum.FILE_NAME_TOO_LONG; +import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; + +/** + * 图标上传管理 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/26 10:01 + */ +@RestController +@RequestMapping("/icon") +public class IconFileUploadController { + + private static int FILE_NAME_MAX_LENGTH = 128; + @Resource + private FileService fileService; + + /** + * 图标上传管理 + * + * @param appCode 应用码 (oss提供) 此处使用app + * @param bizScene 业务场景 (在oss服务中配置) 此处使用app + * @param serviceName 调用方服务名 此处使用web + * @param file 文件 + * @return {@link FileInformationVo} + */ + @PostMapping(value = "/fileUpload", consumes = MULTIPART_FORM_DATA_VALUE) + @CrossOrigin + @SneakyThrows + public CommonResponse uploadV2(@Valid @RequestParam("appCode") String appCode, + @Valid @RequestParam("bizScene") String bizScene, + @Valid @RequestParam("serviceName") String serviceName, + @Valid @RequestPart MultipartFile file) { + + String filename = file.getOriginalFilename(); + BizException.error(filename.length() < FILE_NAME_MAX_LENGTH, FILE_NAME_TOO_LONG); + ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() + .appCode(appCode) + .bizScene(bizScene) + .fileName(filename) + .fileContent(file.getBytes()) + .build(); + FileInformationResponse response = fileService.uploadV2(serviceName, fileUploadDto, null); + FileInformationVo result = BeanConvertUtil.copyBean(response, FileInformationVo.class); + return CommonResponse.success(result); + } +} From 744294cd216d55a89be91599a1fccd9f90263251 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Tue, 26 Dec 2023 13:57:19 +0800 Subject: [PATCH 04/39] =?UTF-8?q?feat(icon=5Fmanage):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E5=AE=9E=E4=BD=93=E7=B1=BBsize=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=B1=BB=E5=9E=8B=E4=B8=BA=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/client/icon/entity/IconDetail.java | 4 ++-- .../axzo/oss/client/icon/vo/request/IconDetailAddReq.java | 7 +++---- .../oss/client/icon/vo/response/IconDetailListResp.java | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java index 8b53227..1835606 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java @@ -52,10 +52,10 @@ public class IconDetail extends Model { private String url; /** - * 图标存储大小,单位KB + * 图标存储大小 */ @TableField("size") - private Double size; + private String size; /** * 尺寸-宽,单位mm diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java index bcc12d3..92ad9ec 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailAddReq.java @@ -44,11 +44,10 @@ public class IconDetailAddReq { private String url; /** - * 图标存储大小,单位KB + * 图标存储大小 */ - @Min(value = 0, message = "图标存储大小不能小于0") - @NotNull(message = "图标存储大小不能为空") - private Double size; + @NotBlank(message = "图标存储大小不能为空") + private String size; /** * 尺寸-宽,单位mm@ diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java index cb150a7..fd930cd 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java @@ -53,7 +53,7 @@ public class IconDetailListResp { /** * 图标存储大小,单位KB */ - private Double size; + private String size; /** * 尺寸-宽,单位mm From 4a1861d227068744a681d481eb897c99362a04b0 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Wed, 27 Dec 2023 10:48:23 +0800 Subject: [PATCH 05/39] =?UTF-8?q?feat(icon=5Fmanage):=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E4=B8=8D=E8=BF=9B=E8=A1=8C=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=80=92=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java | 1 - .../axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java | 1 - 2 files changed, 2 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java index 4d305aa..8b36767 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java @@ -145,7 +145,6 @@ public class IconDetailServiceImpl implements IconDetailService { .in(!CollectionUtils.isEmpty(req.getIds()), IconDetail::getId, req.getIds()) .like(StringUtils.hasText(req.getName()), IconDetail::getName, req) .in(!CollectionUtils.isEmpty(req.getStatuses()), IconDetail::getStatus, req.getStatuses()) - .orderByDesc(IconDetail::getCreateAt) .list(); if (CollectionUtils.isEmpty(iconDetailList)) { return Collections.emptyList(); diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java index 4976190..24dfe20 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java @@ -119,7 +119,6 @@ public class IconGroupServiceImpl implements IconGroupService { .in(!CollectionUtils.isEmpty(req.getTerminals()), IconGroup::getTerminal, req.getTerminals()) .in(!CollectionUtils.isEmpty(req.getGroups()), IconGroup::getGroup, req.getGroups()) .in(!CollectionUtils.isEmpty(req.getStatuses()), IconGroup::getStatus, req.getStatuses()) - .orderByDesc(IconGroup::getCreateAt) .list(); return BeanMapper.copyList(iconGroups, IconGroupListResp.class); } From 0638c168374f799fea7b303fc0221c4896591cc0 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Wed, 27 Dec 2023 10:49:41 +0800 Subject: [PATCH 06/39] =?UTF-8?q?feat(icon=5Fmanage):=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/client/icon/service/impl/IconDetailServiceImpl.java | 4 ---- .../oss/client/icon/service/impl/IconGroupServiceImpl.java | 1 - 2 files changed, 5 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java index 8b36767..e15235f 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java @@ -3,7 +3,6 @@ package cn.axzo.oss.client.icon.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.oss.client.icon.entity.IconDetail; import cn.axzo.oss.client.icon.entity.IconGroup; -import cn.axzo.oss.client.icon.mapper.IconDetailMapper; import cn.axzo.oss.client.icon.repository.IconDetailRepository; import cn.axzo.oss.client.icon.repository.IconGroupRepository; import cn.axzo.oss.client.icon.service.IconDetailService; @@ -21,13 +20,10 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java index 24dfe20..578723a 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconGroupServiceImpl.java @@ -21,7 +21,6 @@ import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Objects; -import java.util.function.BiConsumer; /** * @author chenwenjian From b9fd00518c81b346c08b659b0826020b3e5e84fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Tue, 23 Jan 2024 18:17:46 +0800 Subject: [PATCH 07/39] =?UTF-8?q?add(req-2119):obs--=E6=B5=81=E5=BC=8F?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E3=80=81=E6=96=AD=E7=82=B9=E7=BB=AD=E4=BC=A0?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 45 +++++++++++++++ .../common/enums/FileDownloadTypeEnum.java | 23 ++++++++ .../integration/s3/HuaWeiCloudService.java | 2 + .../s3/impl/HuaWeiCloudServiceImpl.java | 57 +++++++++++++++++++ .../cn/axzo/oss/manager/api/FileManager.java | 2 + .../oss/manager/impl/FileManagerImpl.java | 4 ++ .../cn/axzo/oss/service/api/FileService.java | 2 + .../oss/service/impl/FileServiceImpl.java | 23 ++++++++ 8 files changed, 158 insertions(+) create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/enums/FileDownloadTypeEnum.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 4b1fa92..a466ff5 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -6,6 +6,7 @@ import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.framework.auth.domain.ContextInfoHolder; import cn.axzo.oss.client.vo.*; import cn.axzo.oss.common.enums.ChannelTypeEnum; +import cn.axzo.oss.common.enums.FileDownloadTypeEnum; import cn.axzo.oss.common.enums.FileUploadTypeEnum; import cn.axzo.oss.common.enums.StorageUnitEnum; import cn.axzo.oss.common.exception.BizException; @@ -262,4 +263,48 @@ public class WebFileController { WebFileUploadVo result = BeanConvertUtil.copyBean(response, WebFileUploadVo.class); return CommonResponse.success(result); } + + /** + * obs:流式下载 + * + * @param dto ServerFileDownloadDto + * @param response HttpServletResponse + */ + @SneakyThrows + @GetMapping("/v1/obs/getObject") + @CrossOrigin + public void getObject(@Valid ServerFileDownloadDto dto, HttpServletResponse response) { + ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode()); + try (OutputStream outputStream = response.getOutputStream(); InputStream inputStream = result.getFileStream()) { + response.setContentType("image/jpg"); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename=" + + result.getFileName() + "." + result.getFileFormat()); + IOUtils.copy(inputStream, outputStream); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * obs:断点续传下载 + * + * @param dto ServerFileDownloadDto + * @param response HttpServletResponse + */ + @SneakyThrows + @GetMapping("/v1/obs/downloadFile") + @CrossOrigin + public void downloadFile(@Valid ServerFileDownloadDto dto, HttpServletResponse response) { + ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.CHECK_POINT_DOWNLOAD.getCode()); + try (OutputStream outputStream = response.getOutputStream(); InputStream inputStream = result.getFileStream()) { + response.setContentType("image/jpg"); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename=" + + result.getFileName() + "." + result.getFileFormat()); + IOUtils.copy(inputStream, outputStream); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/FileDownloadTypeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/FileDownloadTypeEnum.java new file mode 100644 index 0000000..0505bba --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/FileDownloadTypeEnum.java @@ -0,0 +1,23 @@ +package cn.axzo.oss.common.enums; + +import lombok.Getter; + +/** + * 文件下载类型枚举类 + * + * @author hucf + * @since 2024/1/23 17:57 + **/ +@Getter +public enum FileDownloadTypeEnum { + STREAM_DOWNLOAD(1, "流式下载"), + CHECK_POINT_DOWNLOAD(2, "断点续传下载") + ; + private final Integer code; + private final String message; + + FileDownloadTypeEnum(Integer code, String message) { + this.code = code; + this.message = message; + } +} diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java index ee7a484..b5fdf01 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java @@ -14,4 +14,6 @@ public interface HuaWeiCloudService { String checkPointUploadFile(String bucketName, String fileName, String appCode, InputStream srcStream, String filePath); String multipartUpload(String bucketName, String fileName, String appCode, InputStream srcStream); + + InputStream getObject(String bucketName, String objectKey, Integer fileDownloadType); } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index 0318880..703e4fb 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -1,5 +1,6 @@ package cn.axzo.oss.integration.s3.impl; +import cn.axzo.oss.common.enums.FileDownloadTypeEnum; import cn.axzo.oss.integration.s3.HuaWeiCloudService; import cn.axzo.oss.integration.s3.client.HuaWeiCloudObsClient; import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig; @@ -225,4 +226,60 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { request.setObjectMetadata(metadata); return obsClient.uploadFile(request); } + + /** + * obs下载文件:流式下载 + * + * @param bucketName 桶名称 + * @param objectKey 对象名称 + * @return InputStream + */ + @Override + public InputStream getObject(String bucketName, String objectKey, Integer fileDownloadType) { + ObsClient obsClient = huaWeiCloudObsClient.getClient(); + if (FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode().equals(fileDownloadType)) { + try { + GetObjectRequest request = new GetObjectRequest(); + request.setBucketName(bucketName); + request.setObjectKey(objectKey); + + ObsObject object = obsClient.getObject(request); + return object.getObjectContent(); + } catch (ObsException obsException) { + log.info("下载华为云OBS文件失败,HTTP Code:{}, Error Code:{}, Request ID:{}, Host ID:{}, Error Message:{}", + obsException.getResponseCode(), + obsException.getErrorCode(), + obsException.getErrorRequestId(), + obsException.getErrorHostId(), + obsException.getErrorMessage()); + } + } else if (FileDownloadTypeEnum.CHECK_POINT_DOWNLOAD.getCode().equals(fileDownloadType)) { + try { + DownloadFileRequest request = new DownloadFileRequest(bucketName, objectKey); + // 设置下载对象的本地文件全路径,当该值为空时,默认为当前程序的运行目录。 + request.setDownloadFile(""); + // 设置分段下载时的最大并发数 + request.setTaskNum(Integer.parseInt(huaWeiCloudObsConfig.getTaskNum())); + // 设置分段大小为10MB + request.setPartSize(Long.parseLong(huaWeiCloudObsConfig.getPartSize())); + // 是否开启断点续传模式 + request.setEnableCheckpoint(Boolean.parseBoolean(huaWeiCloudObsConfig.getEnableCheckPoint())); + // 是否自动解码响应头 + request.setIsEncodeHeaders(Boolean.parseBoolean(huaWeiCloudObsConfig.getEncodeHeaders())); + + DownloadFileResult downloadFileResult = obsClient.downloadFile(request); + String etag = downloadFileResult.getObjectMetadata().getEtag(); + } catch (NumberFormatException e) { + throw new RuntimeException(e); + } catch (ObsException obsException) { + log.info("下载华为云OBS文件失败,HTTP Code:{}, Error Code:{}, Request ID:{}, Host ID:{}, Error Message:{}", + obsException.getResponseCode(), + obsException.getErrorCode(), + obsException.getErrorRequestId(), + obsException.getErrorHostId(), + obsException.getErrorMessage()); + } + } + return null; + } } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index 3ac0ec1..3e67ad2 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -51,4 +51,6 @@ public interface FileManager { String multipartUploadComplete(String bucketName, String tgtFileKey, String uploadId, List partETags); String multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file); + + InputStream downloadObsFile(String bucketName, String objectKey, Integer fileDownloadType); } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index c0a6005..5b342ef 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -124,4 +124,8 @@ public class FileManagerImpl implements FileManager { } return partETagList; } + + public InputStream downloadObsFile(String bucketName, String objectKey, Integer fileDownloadType) { + return huaWeiCloudService.getObject(bucketName, objectKey, fileDownloadType); + } } diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java index 52e364e..a021c80 100644 --- a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -51,4 +51,6 @@ public interface FileService { Integer fileUploadType); String getFilePath(MultipartFile file); + + ServerFileDownloadResponse getObject(ServerFileDownloadDto dto, Integer fileDownloadType); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index fe1902a..80a8b0f 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -697,4 +697,27 @@ public class FileServiceImpl implements FileService { throw new RuntimeException(e); } } + + public ServerFileDownloadResponse getObject(ServerFileDownloadDto dto, Integer fileDownloadType) { + log.info("obs download file = {}", JsonUtil.obj2Str(dto)); + File file = null; + String fileKey = dto.getFileKey(); + if (fileKey.contains(IS_URL)) { + String urlMd5 = Utility.getMd5(fileKey); + file = fileDao.getByUrlMd5(urlMd5); + } else { + file = fileDao.getByFileUuid(fileKey); + } + if (Utility.objIsNull(file)) { + log.warn("obs download file is null, fileKey = {}", fileKey); + BizException.error(false, CodeEnum.FILE_NOT_FOUND); + } + + // 对象名称:目录+文件名 + String objectKey = file.getDirectory() + SEPARATOR + file.getFileName(); + // 桶名称 + String bucketName = file.getBucketName(); + InputStream fileStream = fileManager.downloadObsFile(bucketName, objectKey, fileDownloadType); + return setFileDownloadResponse(file, fileStream); + } } From b38d6e5318e75a85ecb11e8e962be571e47d79fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=9D=E8=B0=A6?= Date: Tue, 27 Feb 2024 14:08:11 +0800 Subject: [PATCH 08/39] =?UTF-8?q?=E6=9A=B4=E9=9C=B2=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=88=B0obs=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 1 + .../axzo/oss/http/api/WebFileServiceApi.java | 36 +++++++++++++++++++ .../axzo/oss/http/model}/WebFileUploadVo.java | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java rename {oss-client/src/main/java/cn/axzo/oss/client/vo => oss-http-api/src/main/java/cn/axzo/oss/http/model}/WebFileUploadVo.java (90%) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index a466ff5..88b8003 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -11,6 +11,7 @@ import cn.axzo.oss.common.enums.FileUploadTypeEnum; import cn.axzo.oss.common.enums.StorageUnitEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.BeanConvertUtil; +import cn.axzo.oss.http.model.WebFileUploadVo; import cn.axzo.oss.manager.api.dto.request.*; import cn.axzo.oss.manager.api.dto.response.*; import cn.axzo.oss.service.api.FileService; diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java new file mode 100644 index 0000000..1df9347 --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -0,0 +1,36 @@ +package cn.axzo.oss.http.api; + +import cn.axzo.oss.http.model.WebFileUploadVo; +import cn.azxo.framework.common.model.CommonResponse; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; + +import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; + +/** + * @author wangsiqian + * @since 2024/02/27 + */ +@FeignClient( + name = "oss", + url = "http://oss:9123" +) +public interface WebFileServiceApi { + /** + * OBS:文件上传(断点续传) + * + * @param appCode 应用编码 + * @param bizScene 业务场景 + * @param file MultipartFile + * @return WebFileUploadVo + */ + @PostMapping(value = "/v1/file2", consumes = MULTIPART_FORM_DATA_VALUE) + CommonResponse uploadObs(@Valid @RequestParam("appCode") String appCode, + @Valid @RequestParam("bizScene") String bizScene, + @Valid @RequestPart MultipartFile file); +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/vo/WebFileUploadVo.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/WebFileUploadVo.java similarity index 90% rename from oss-client/src/main/java/cn/axzo/oss/client/vo/WebFileUploadVo.java rename to oss-http-api/src/main/java/cn/axzo/oss/http/model/WebFileUploadVo.java index 4ffa7f5..82ea3dc 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/vo/WebFileUploadVo.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/WebFileUploadVo.java @@ -1,4 +1,4 @@ -package cn.axzo.oss.client.vo; +package cn.axzo.oss.http.model; import lombok.Data; From a90b5deba927b276362de42406fe8f50879d8da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=9D=E8=B0=A6?= Date: Tue, 27 Feb 2024 14:55:05 +0800 Subject: [PATCH 09/39] fix bugs --- .../src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 1df9347..e23de25 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -29,7 +29,7 @@ public interface WebFileServiceApi { * @param file MultipartFile * @return WebFileUploadVo */ - @PostMapping(value = "/v1/file2", consumes = MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "/webApi/v1/file2", consumes = MULTIPART_FORM_DATA_VALUE) CommonResponse uploadObs(@Valid @RequestParam("appCode") String appCode, @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); From c60e8afe371b8dc185b00afb768d6a282bd37803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Wed, 6 Mar 2024 15:24:04 +0800 Subject: [PATCH 10/39] =?UTF-8?q?add(req-2119):=E6=96=B0=E5=A2=9E=E2=80=9C?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6"API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 9 ++++ .../oss/http/api/ServerFileServiceApi.java | 9 ++++ .../model/DownloadFileFromObsRequest.java | 28 +++++++++++ .../model/DownloadFileFromObsResponse.java | 46 +++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsRequest.java create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsResponse.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 5e59ad6..b63ac8b 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -8,7 +8,9 @@ import cn.axzo.oss.http.model.*; import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto; import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; +import cn.axzo.oss.manager.api.dto.response.ServerFileDownloadResponse; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import cn.hutool.json.JSONUtil; @@ -92,4 +94,11 @@ public class ServerFileController implements ServerFileServiceApi { FindFileKeyDto dto = BeanConvertUtil.copyBean(request, FindFileKeyDto.class); return CommonResponse.success(BeanConverter.convert(fileService.findFileKey(dto), FindFileKeyResponse.class)); } + + @Override + public CommonResponse downloadFileFromOBS(@Valid @RequestBody DownloadFileFromObsRequest request) { + ServerFileDownloadDto serverFileDownloadDto = BeanConvertUtil.copyBean(request, ServerFileDownloadDto.class); + ServerFileDownloadResponse res = fileService.getObject(serverFileDownloadDto, request.getFileDownloadType()); + return CommonResponse.success(BeanConverter.convert(res, DownloadFileFromObsResponse.class)); + } } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java index 75d849f..d7bd676 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java @@ -57,4 +57,13 @@ public interface ServerFileServiceApi { */ @RequestMapping(value = "api/v1/server/getFileKey", method = RequestMethod.POST) CommonResponse> getFileKey(FindFileKeyRequest request); + + /** + * 从华为云上下载文件 + * + * @param request DownloadFileFromObsRequest + * @return DownloadFileFromObsResponse + */ + @RequestMapping(value = "api/v1/server/downloadFileFromOBS", method = RequestMethod.POST) + CommonResponse downloadFileFromOBS(DownloadFileFromObsRequest request); } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsRequest.java new file mode 100644 index 0000000..4064d1b --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsRequest.java @@ -0,0 +1,28 @@ +package cn.axzo.oss.http.model; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @author hucf + * @since 2024/3/6 15:11 + **/ +@Data +public class DownloadFileFromObsRequest { + /** + * 文件uuid + */ + @NotBlank + private String fileKey; + + /** + * 图片样式 + */ + private String style; + + /** + * 下载方式 + */ + private Integer fileDownloadType; +} diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsResponse.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsResponse.java new file mode 100644 index 0000000..8f80133 --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsResponse.java @@ -0,0 +1,46 @@ +package cn.axzo.oss.http.model; + +import lombok.Data; + +import java.io.InputStream; + +/** + * @author hucf + * @since 2024/3/6 15:15 + **/ +@Data +public class DownloadFileFromObsResponse { + /** + * 文件 URL + */ + private String url; + /** + * 文件 Key + */ + private String fileKey; + + /** + * URL MD5 + */ + private String urlMd5; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件大小 + */ + private Long fileSize; + + /** + * 文件格式 + */ + private String fileFormat; + + /** + * 文件流 + */ + private InputStream fileStream; +} From 2aaa3f7ece22cb7d0c3fe6bd4671b90207e5f677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Wed, 6 Mar 2024 15:54:44 +0800 Subject: [PATCH 11/39] =?UTF-8?q?add(req-2119):=E6=96=B0=E5=A2=9E=E2=80=9C?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6"API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/client/controller/ServerFileController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index b63ac8b..97ca2d5 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -95,6 +95,12 @@ public class ServerFileController implements ServerFileServiceApi { return CommonResponse.success(BeanConverter.convert(fileService.findFileKey(dto), FindFileKeyResponse.class)); } + /** + * 从华为云上下载文件 + * + * @param request DownloadFileFromObsRequest + * @return DownloadFileFromObsResponse + */ @Override public CommonResponse downloadFileFromOBS(@Valid @RequestBody DownloadFileFromObsRequest request) { ServerFileDownloadDto serverFileDownloadDto = BeanConvertUtil.copyBean(request, ServerFileDownloadDto.class); From 17744baafe8bf9449b5ef16f197a4b2308c2e78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Wed, 6 Mar 2024 16:04:21 +0800 Subject: [PATCH 12/39] =?UTF-8?q?add(req-2119):=E6=96=B0=E5=A2=9E=E2=80=9C?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6"API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index e23de25..4e5d65a 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -1,5 +1,7 @@ package cn.axzo.oss.http.api; +import cn.axzo.oss.http.model.DownloadFileFromObsRequest; +import cn.axzo.oss.http.model.DownloadFileFromObsResponse; import cn.axzo.oss.http.model.WebFileUploadVo; import cn.azxo.framework.common.model.CommonResponse; import org.springframework.cloud.openfeign.FeignClient; @@ -33,4 +35,7 @@ public interface WebFileServiceApi { CommonResponse uploadObs(@Valid @RequestParam("appCode") String appCode, @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); + + @PostMapping("api/v1/server/downloadFileFromObs") + CommonResponse downloadFileFromOBS(DownloadFileFromObsRequest request); } From 25d8047efeedf023330632e0131cd4c8f04f6ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Wed, 6 Mar 2024 23:35:38 +0800 Subject: [PATCH 13/39] =?UTF-8?q?add(req-2119):=E6=B5=8B=E8=AF=95=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=96=87=E4=BB=B6=E5=88=B0=E6=9C=AC=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 20 +++++++++++++++++++ .../oss/service/impl/FileServiceImpl.java | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 88b8003..6ba8707 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -308,4 +308,24 @@ public class WebFileController { e.printStackTrace(); } } + + @SneakyThrows + @GetMapping("/v1/obs/testDownload") + @CrossOrigin + public void testDownload(@Valid ServerFileDownloadDto dto, HttpServletResponse response) { + ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode()); + try (InputStream inputStream = result.getFileStream()) { + FileOutputStream fileOutputStream = new FileOutputStream("/Users/axzo/Desktop/" + result.getFileName()); + byte[] buffer = new byte[1024]; + int byteRead; + while ((byteRead = inputStream.read(buffer, 0, 1024)) != -1) { + fileOutputStream.write(buffer, 0, byteRead); + } + + fileOutputStream.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 80a8b0f..467c2fc 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -295,7 +295,7 @@ public class FileServiceImpl implements FileService { ossFile.setAppCode(fileUploadConfig.getAppCode()); ossFile.setChannelCode(fileUploadConfig.getChannelCode()); ossFile.setBucketName(fileUploadConfig.getBucketName()); - ossFile.setDirectory(fileUploadConfig.getDirectory()); + ossFile.setDirectory(huaWeiCloudObsConfig.getProfilesActive() + SEPARATOR + fileUploadConfig.getDirectory()); ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode()); ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); ossFile.setStorageSize(fileUploadConfig.getStorageSize()); From b286e2ddd747c69616c19d542841e61cbfa62ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 10:25:00 +0800 Subject: [PATCH 14/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 3 --- .../cn/axzo/oss/http/model/DownloadFileFromObsRequest.java | 6 ++++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 4e5d65a..3b62ad3 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -35,7 +35,4 @@ public interface WebFileServiceApi { CommonResponse uploadObs(@Valid @RequestParam("appCode") String appCode, @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); - - @PostMapping("api/v1/server/downloadFileFromObs") - CommonResponse downloadFileFromOBS(DownloadFileFromObsRequest request); } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsRequest.java index 4064d1b..c21ea23 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/DownloadFileFromObsRequest.java @@ -3,6 +3,7 @@ package cn.axzo.oss.http.model; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; /** * @author hucf @@ -13,7 +14,7 @@ public class DownloadFileFromObsRequest { /** * 文件uuid */ - @NotBlank + @NotBlank(message = "文件uuid不能为空") private String fileKey; /** @@ -22,7 +23,8 @@ public class DownloadFileFromObsRequest { private String style; /** - * 下载方式 + * 下载方式:1:流式下载;2:断点续传方式下载 */ + @NotNull(message = "下载方式不能为空") private Integer fileDownloadType; } From ca8cbcd3795ddac2368dc190892de3b4e2666de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 10:55:16 +0800 Subject: [PATCH 15/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/client/controller/ServerFileController.java | 4 +++- .../oss/integration/s3/impl/HuaWeiCloudServiceImpl.java | 6 ++++-- .../main/java/cn/axzo/oss/service/impl/FileServiceImpl.java | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 97ca2d5..10ea556 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -105,6 +105,8 @@ public class ServerFileController implements ServerFileServiceApi { public CommonResponse downloadFileFromOBS(@Valid @RequestBody DownloadFileFromObsRequest request) { ServerFileDownloadDto serverFileDownloadDto = BeanConvertUtil.copyBean(request, ServerFileDownloadDto.class); ServerFileDownloadResponse res = fileService.getObject(serverFileDownloadDto, request.getFileDownloadType()); - return CommonResponse.success(BeanConverter.convert(res, DownloadFileFromObsResponse.class)); + DownloadFileFromObsResponse result = BeanConverter.convert(res, DownloadFileFromObsResponse.class); + result.setFileStream(res.getFileStream()); + return CommonResponse.success(result); } } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index 703e4fb..194e3cc 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -244,9 +244,10 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { request.setObjectKey(objectKey); ObsObject object = obsClient.getObject(request); + log.info("下载华为云OBS文件成功"); return object.getObjectContent(); } catch (ObsException obsException) { - log.info("下载华为云OBS文件失败,HTTP Code:{}, Error Code:{}, Request ID:{}, Host ID:{}, Error Message:{}", + log.warn("下载华为云OBS文件失败,HTTP Code:{}, Error Code:{}, Request ID:{}, Host ID:{}, Error Message:{}", obsException.getResponseCode(), obsException.getErrorCode(), obsException.getErrorRequestId(), @@ -269,10 +270,11 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { DownloadFileResult downloadFileResult = obsClient.downloadFile(request); String etag = downloadFileResult.getObjectMetadata().getEtag(); + log.info("下载华为云OBS文件成功"); } catch (NumberFormatException e) { throw new RuntimeException(e); } catch (ObsException obsException) { - log.info("下载华为云OBS文件失败,HTTP Code:{}, Error Code:{}, Request ID:{}, Host ID:{}, Error Message:{}", + log.warn("下载华为云OBS文件失败,HTTP Code:{}, Error Code:{}, Request ID:{}, Host ID:{}, Error Message:{}", obsException.getResponseCode(), obsException.getErrorCode(), obsException.getErrorRequestId(), diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 467c2fc..e219a9a 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -718,6 +718,9 @@ public class FileServiceImpl implements FileService { // 桶名称 String bucketName = file.getBucketName(); InputStream fileStream = fileManager.downloadObsFile(bucketName, objectKey, fileDownloadType); + if (Objects.isNull(fileStream)) { + log.warn("下载的文件流为空"); + } return setFileDownloadResponse(file, fileStream); } } From 692a0c1e4b7aef77f8bc691111a155a4a41a065b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 14:12:58 +0800 Subject: [PATCH 16/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 19 ++++----------- .../client/controller/WebFileController.java | 23 +++++++++---------- oss-http-api/pom.xml | 5 ++++ .../oss/http/api/ServerFileServiceApi.java | 13 ++++------- .../axzo/oss/http/api/WebFileServiceApi.java | 7 +++++- 5 files changed, 30 insertions(+), 37 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 10ea556..aeab550 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -14,12 +14,16 @@ import cn.axzo.oss.manager.api.dto.response.ServerFileDownloadResponse; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import cn.hutool.json.JSONUtil; +import feign.Response; +import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; +import java.io.InputStream; +import java.io.OutputStream; import java.util.List; /** @@ -94,19 +98,4 @@ public class ServerFileController implements ServerFileServiceApi { FindFileKeyDto dto = BeanConvertUtil.copyBean(request, FindFileKeyDto.class); return CommonResponse.success(BeanConverter.convert(fileService.findFileKey(dto), FindFileKeyResponse.class)); } - - /** - * 从华为云上下载文件 - * - * @param request DownloadFileFromObsRequest - * @return DownloadFileFromObsResponse - */ - @Override - public CommonResponse downloadFileFromOBS(@Valid @RequestBody DownloadFileFromObsRequest request) { - ServerFileDownloadDto serverFileDownloadDto = BeanConvertUtil.copyBean(request, ServerFileDownloadDto.class); - ServerFileDownloadResponse res = fileService.getObject(serverFileDownloadDto, request.getFileDownloadType()); - DownloadFileFromObsResponse result = BeanConverter.convert(res, DownloadFileFromObsResponse.class); - result.setFileStream(res.getFileStream()); - return CommonResponse.success(result); - } } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 6ba8707..6fdf194 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -11,6 +11,7 @@ import cn.axzo.oss.common.enums.FileUploadTypeEnum; import cn.axzo.oss.common.enums.StorageUnitEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.BeanConvertUtil; +import cn.axzo.oss.http.model.DownloadFileFromObsRequest; import cn.axzo.oss.http.model.WebFileUploadVo; import cn.axzo.oss.manager.api.dto.request.*; import cn.axzo.oss.manager.api.dto.response.*; @@ -310,20 +311,18 @@ public class WebFileController { } @SneakyThrows - @GetMapping("/v1/obs/testDownload") + @GetMapping("/v1/obs/downloadFileFromObs") @CrossOrigin - public void testDownload(@Valid ServerFileDownloadDto dto, HttpServletResponse response) { + public void downloadFileFromObs(@Valid DownloadFileFromObsRequest req, HttpServletResponse response) { + ServerFileDownloadDto dto = new ServerFileDownloadDto(); + dto.setFileKey(req.getFileKey()); ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode()); - try (InputStream inputStream = result.getFileStream()) { - FileOutputStream fileOutputStream = new FileOutputStream("/Users/axzo/Desktop/" + result.getFileName()); - byte[] buffer = new byte[1024]; - int byteRead; - while ((byteRead = inputStream.read(buffer, 0, 1024)) != -1) { - fileOutputStream.write(buffer, 0, byteRead); - } - - fileOutputStream.close(); - + try (OutputStream outputStream = response.getOutputStream(); InputStream inputStream = result.getFileStream()) { + response.setContentType("image/jpg"); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename=" + + result.getFileName() + "." + result.getFileFormat()); + IOUtils.copy(inputStream, outputStream); } catch (Exception e) { e.printStackTrace(); } diff --git a/oss-http-api/pom.xml b/oss-http-api/pom.xml index 478fbf9..5971e9b 100644 --- a/oss-http-api/pom.xml +++ b/oss-http-api/pom.xml @@ -35,6 +35,11 @@ org.springframework.cloud spring-cloud-openfeign-core + + + cn.axzo.oss + oss-service + diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java index d7bd676..acded70 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java @@ -3,9 +3,13 @@ package cn.axzo.oss.http.api; import cn.axzo.oss.http.model.*; import cn.azxo.framework.common.model.CommonResponse; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +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.RequestMethod; +import feign.Response; import java.util.List; /** @@ -57,13 +61,4 @@ public interface ServerFileServiceApi { */ @RequestMapping(value = "api/v1/server/getFileKey", method = RequestMethod.POST) CommonResponse> getFileKey(FindFileKeyRequest request); - - /** - * 从华为云上下载文件 - * - * @param request DownloadFileFromObsRequest - * @return DownloadFileFromObsResponse - */ - @RequestMapping(value = "api/v1/server/downloadFileFromOBS", method = RequestMethod.POST) - CommonResponse downloadFileFromOBS(DownloadFileFromObsRequest request); } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 3b62ad3..32f57e8 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -1,11 +1,13 @@ package cn.axzo.oss.http.api; import cn.axzo.oss.http.model.DownloadFileFromObsRequest; -import cn.axzo.oss.http.model.DownloadFileFromObsResponse; import cn.axzo.oss.http.model.WebFileUploadVo; import cn.azxo.framework.common.model.CommonResponse; +import feign.Response; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; @@ -35,4 +37,7 @@ public interface WebFileServiceApi { CommonResponse uploadObs(@Valid @RequestParam("appCode") String appCode, @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); + + @PostMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE) + CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); } From e927b5e0e1d3d5617c38c00ad41e4cd80046245b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 15:31:54 +0800 Subject: [PATCH 17/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 32f57e8..744c45a 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -38,6 +38,6 @@ public interface WebFileServiceApi { @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); - @PostMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE) - CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); + /*@PostMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE) + CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req);*/ } From 40a34c5cf1bd1f1e373e07406c3e898988a0194c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 16:19:14 +0800 Subject: [PATCH 18/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=952?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 744c45a..32f57e8 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -38,6 +38,6 @@ public interface WebFileServiceApi { @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); - /*@PostMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE) - CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req);*/ + @PostMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE) + CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); } From abd9016332fb487fd0d2bdaad83c51e3427d5083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 16:46:07 +0800 Subject: [PATCH 19/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=953?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 32f57e8..9bf2890 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -38,6 +38,6 @@ public interface WebFileServiceApi { @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); - @PostMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE) + @PostMapping(value = "/webApi/v1/obs/downloadFileFromObs") CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); } From e303b865323a12afc03d05d42535df7d42c0ab3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 16:50:55 +0800 Subject: [PATCH 20/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=954?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 9bf2890..80bbef2 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -8,6 +8,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; @@ -38,6 +39,6 @@ public interface WebFileServiceApi { @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); - @PostMapping(value = "/webApi/v1/obs/downloadFileFromObs") + @RequestMapping("/webApi/v1/obs/downloadFileFromObs") CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); } From 0d57dc75f9fbe2876be7c47a9fdbbe10c6667a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 16:59:52 +0800 Subject: [PATCH 21/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=955?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 8 ++++++ .../cn/axzo/oss/http/api/DownloadFileApi.java | 27 +++++++++++++++++++ .../axzo/oss/http/api/WebFileServiceApi.java | 8 ------ 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 6fdf194..974bb14 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -18,6 +18,7 @@ import cn.axzo.oss.manager.api.dto.response.*; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -39,6 +40,7 @@ import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; **/ @RestController @RequestMapping("/webApi") +@Slf4j public class WebFileController { private static int FILE_NAME_MAX_LENGTH = 128; @@ -327,4 +329,10 @@ public class WebFileController { e.printStackTrace(); } } + + @GetMapping("/v1/obs/test") + public CommonResponse test() { + log.info("test"); + return CommonResponse.success("success"); + } } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java new file mode 100644 index 0000000..a288d9e --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java @@ -0,0 +1,27 @@ +package cn.axzo.oss.http.api; + +import cn.axzo.oss.http.model.DownloadFileFromObsRequest; +import cn.azxo.framework.common.model.CommonResponse; +import feign.Response; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; + +/** + * @author axzo + * @since 2024/3/7 16:56 + **/ +@FeignClient( + name = "oss", + url = "http://oss:9123" +) +public interface DownloadFileApi { + @RequestMapping("/webApi/v1/obs/downloadFileFromObs") + CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); + + @GetMapping("/v1/obs/test") + CommonResponse test(); +} diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 80bbef2..e23de25 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -1,14 +1,9 @@ package cn.axzo.oss.http.api; -import cn.axzo.oss.http.model.DownloadFileFromObsRequest; import cn.axzo.oss.http.model.WebFileUploadVo; import cn.azxo.framework.common.model.CommonResponse; -import feign.Response; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; @@ -38,7 +33,4 @@ public interface WebFileServiceApi { CommonResponse uploadObs(@Valid @RequestParam("appCode") String appCode, @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); - - @RequestMapping("/webApi/v1/obs/downloadFileFromObs") - CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); } From 5cedb11e8cdabe76d953f2885779148b94af0412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 17:11:19 +0800 Subject: [PATCH 22/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=956?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java index a288d9e..b4a7ec7 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java @@ -22,6 +22,6 @@ public interface DownloadFileApi { @RequestMapping("/webApi/v1/obs/downloadFileFromObs") CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); - @GetMapping("/v1/obs/test") + @GetMapping("/webApi/v1/obs/test") CommonResponse test(); } From 03eb0c4caf55eedb719f39c6ea8fcb8408d98bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 17:18:35 +0800 Subject: [PATCH 23/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=957?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/oss/client/controller/WebFileController.java | 4 ++-- .../java/cn/axzo/oss/http/api/DownloadFileApi.java | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 974bb14..6beb8d1 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -315,9 +315,9 @@ public class WebFileController { @SneakyThrows @GetMapping("/v1/obs/downloadFileFromObs") @CrossOrigin - public void downloadFileFromObs(@Valid DownloadFileFromObsRequest req, HttpServletResponse response) { + public void downloadFileFromObs(@RequestParam("fileUuid") String fileUuId, HttpServletResponse response) { ServerFileDownloadDto dto = new ServerFileDownloadDto(); - dto.setFileKey(req.getFileKey()); + dto.setFileKey(fileUuId); ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode()); try (OutputStream outputStream = response.getOutputStream(); InputStream inputStream = result.getFileStream()) { response.setContentType("image/jpg"); diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java index b4a7ec7..a23c5af 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java @@ -1,14 +1,11 @@ package cn.axzo.oss.http.api; -import cn.axzo.oss.http.model.DownloadFileFromObsRequest; import cn.azxo.framework.common.model.CommonResponse; import feign.Response; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; - -import javax.validation.Valid; +import org.springframework.web.bind.annotation.RequestParam; /** * @author axzo @@ -19,8 +16,8 @@ import javax.validation.Valid; url = "http://oss:9123" ) public interface DownloadFileApi { - @RequestMapping("/webApi/v1/obs/downloadFileFromObs") - CommonResponse downloadFileFromObs(@Valid @RequestBody DownloadFileFromObsRequest req); + @GetMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE) + CommonResponse downloadFileFromObs(@RequestParam("fileUuid") String fileUuId); @GetMapping("/webApi/v1/obs/test") CommonResponse test(); From fb1d20d2a83aed340ba8077f1e9c20007fcd3ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 17:30:03 +0800 Subject: [PATCH 24/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=957?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/client/controller/WebFileController.java | 7 +------ .../main/java/cn/axzo/oss/http/api/DownloadFileApi.java | 5 +---- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 6beb8d1..6f18a84 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -325,14 +325,9 @@ public class WebFileController { response.addHeader("Content-Disposition", "attachment;filename=" + result.getFileName() + "." + result.getFileFormat()); IOUtils.copy(inputStream, outputStream); + log.info("文件转换成功"); } catch (Exception e) { e.printStackTrace(); } } - - @GetMapping("/v1/obs/test") - public CommonResponse test() { - log.info("test"); - return CommonResponse.success("success"); - } } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java index a23c5af..95079fc 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java @@ -16,9 +16,6 @@ import org.springframework.web.bind.annotation.RequestParam; url = "http://oss:9123" ) public interface DownloadFileApi { - @GetMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE) + @GetMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE) CommonResponse downloadFileFromObs(@RequestParam("fileUuid") String fileUuId); - - @GetMapping("/webApi/v1/obs/test") - CommonResponse test(); } From 84a205698a0bc18e30d614b6539639d19de57b4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 17:49:08 +0800 Subject: [PATCH 25/39] =?UTF-8?q?add(req-2119):=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API-=E8=B0=83=E8=AF=958?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java index 95079fc..0895f7c 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java @@ -16,6 +16,6 @@ import org.springframework.web.bind.annotation.RequestParam; url = "http://oss:9123" ) public interface DownloadFileApi { - @GetMapping(value = "/webApi/v1/obs/downloadFileFromObs", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE) + @GetMapping(value = "/webApi/v1/obs/downloadFileFromObs") CommonResponse downloadFileFromObs(@RequestParam("fileUuid") String fileUuId); } From 4c416e95ce022af35214af23cd15c7f857ec3f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Thu, 7 Mar 2024 17:49:40 +0800 Subject: [PATCH 26/39] =?UTF-8?q?feat(req-2119):=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=A4=9A=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java | 1 - 1 file changed, 1 deletion(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java index 0895f7c..ee97880 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java @@ -3,7 +3,6 @@ package cn.axzo.oss.http.api; import cn.azxo.framework.common.model.CommonResponse; import feign.Response; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; From 0875656416633b94bd404eac33a87a44cd41f6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Fri, 8 Mar 2024 13:56:57 +0800 Subject: [PATCH 27/39] =?UTF-8?q?feat(req-2119):=E8=AE=BE=E7=BD=AEResponse?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/client/controller/WebFileController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 6f18a84..f0167d3 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -320,10 +320,10 @@ public class WebFileController { dto.setFileKey(fileUuId); ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode()); try (OutputStream outputStream = response.getOutputStream(); InputStream inputStream = result.getFileStream()) { - response.setContentType("image/jpg"); - response.setCharacterEncoding("UTF-8"); - response.addHeader("Content-Disposition", "attachment;filename=" - + result.getFileName() + "." + result.getFileFormat()); + response.setContentType("application/octet-stream"); + response.setHeader("content-type","application/octet-stream"); + response.addHeader("Content-Disposition", "attachment;filename=" + result.getFileName() + "." + result.getFileFormat()); + // response.setCharacterEncoding("UTF-8"); IOUtils.copy(inputStream, outputStream); log.info("文件转换成功"); } catch (Exception e) { From 6890bdebb48bc2b04447b38e469fda4ad2cbe07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Fri, 8 Mar 2024 15:26:19 +0800 Subject: [PATCH 28/39] =?UTF-8?q?feat(req-2119):=E8=AE=BE=E7=BD=AEReponse?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=80=BC3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index e23de25..8af040a 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -2,7 +2,9 @@ package cn.axzo.oss.http.api; import cn.axzo.oss.http.model.WebFileUploadVo; import cn.azxo.framework.common.model.CommonResponse; +import feign.Response; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; @@ -33,4 +35,7 @@ public interface WebFileServiceApi { CommonResponse uploadObs(@Valid @RequestParam("appCode") String appCode, @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); + + @GetMapping(value = "/webApi/v1/obs/downloadFileFromObs") + Response downloadFileFromObs2(@RequestParam("fileUuid") String fileUuId); } From cb69c32d31c9fbc5df31a845ac622d2dcc09f8f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Fri, 8 Mar 2024 15:39:27 +0800 Subject: [PATCH 29/39] =?UTF-8?q?feat(req-2119):=E6=B3=A8=E9=87=8AsetConte?= =?UTF-8?q?ntType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/client/controller/WebFileController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index f0167d3..ed30958 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -320,7 +320,7 @@ public class WebFileController { dto.setFileKey(fileUuId); ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode()); try (OutputStream outputStream = response.getOutputStream(); InputStream inputStream = result.getFileStream()) { - response.setContentType("application/octet-stream"); + // response.setContentType("application/octet-stream"); response.setHeader("content-type","application/octet-stream"); response.addHeader("Content-Disposition", "attachment;filename=" + result.getFileName() + "." + result.getFileFormat()); // response.setCharacterEncoding("UTF-8"); From 3c407ebbe229a99807d37718b944ba99a3124348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Fri, 8 Mar 2024 15:42:00 +0800 Subject: [PATCH 30/39] =?UTF-8?q?feat(req-2119):=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 8af040a..e746464 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -20,7 +20,7 @@ import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; */ @FeignClient( name = "oss", - url = "http://oss:9123" + url = "http://localhost:9123" ) public interface WebFileServiceApi { /** From 2e1fcda0b105422d37555b6975978871140bc872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Fri, 8 Mar 2024 16:26:46 +0800 Subject: [PATCH 31/39] =?UTF-8?q?feat(req-2119):=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 34 ++++++++++++++----- .../axzo/oss/http/api/WebFileServiceApi.java | 2 +- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index ed30958..37bb953 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -319,15 +319,31 @@ public class WebFileController { ServerFileDownloadDto dto = new ServerFileDownloadDto(); dto.setFileKey(fileUuId); ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode()); - try (OutputStream outputStream = response.getOutputStream(); InputStream inputStream = result.getFileStream()) { - // response.setContentType("application/octet-stream"); - response.setHeader("content-type","application/octet-stream"); - response.addHeader("Content-Disposition", "attachment;filename=" + result.getFileName() + "." + result.getFileFormat()); - // response.setCharacterEncoding("UTF-8"); - IOUtils.copy(inputStream, outputStream); - log.info("文件转换成功"); - } catch (Exception e) { - e.printStackTrace(); + + byte[] buff = new byte[1024]; + InputStream is = null; + OutputStream os = null; + try { + os = response.getOutputStream(); + is = result.getFileStream(); + int i = is.read(buff); + while (i != -1) { + os.write(buff, 0, buff.length); + os.flush(); + i = is.read(buff); + } + log.info("oss下载完成"); + } catch (IOException e2){ + e2.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + //os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index e746464..8af040a 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -20,7 +20,7 @@ import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; */ @FeignClient( name = "oss", - url = "http://localhost:9123" + url = "http://oss:9123" ) public interface WebFileServiceApi { /** From fd4033f2849ad132389377294ddc6f366f9192bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Fri, 8 Mar 2024 17:16:02 +0800 Subject: [PATCH 32/39] =?UTF-8?q?feat(req-2119):=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java index 8af040a..613c915 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/WebFileServiceApi.java @@ -35,7 +35,4 @@ public interface WebFileServiceApi { CommonResponse uploadObs(@Valid @RequestParam("appCode") String appCode, @Valid @RequestParam("bizScene") String bizScene, @Valid @RequestPart MultipartFile file); - - @GetMapping(value = "/webApi/v1/obs/downloadFileFromObs") - Response downloadFileFromObs2(@RequestParam("fileUuid") String fileUuId); } From 603cf218c88ae1566fa0e23a5847825a18a00dd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Mon, 11 Mar 2024 10:01:01 +0800 Subject: [PATCH 33/39] =?UTF-8?q?feat(req-2119):=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=8C=85=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-http-api/pom.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/oss-http-api/pom.xml b/oss-http-api/pom.xml index 5971e9b..cd15303 100644 --- a/oss-http-api/pom.xml +++ b/oss-http-api/pom.xml @@ -35,10 +35,9 @@ org.springframework.cloud spring-cloud-openfeign-core - - cn.axzo.oss - oss-service + org.springframework.cloud + spring-cloud-starter-openfeign From ece9bdf777982feb7d3fdcd59a17e12fdcbe1850 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Mon, 11 Mar 2024 14:16:21 +0800 Subject: [PATCH 34/39] =?UTF-8?q?feat(icon=5Fmanage):=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=9B=BE=E6=A0=87=E7=B1=BB=E5=9E=8B=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icon/controller/IconDetailController.java | 15 +++++++ .../oss/client/icon/entity/IconDetail.java | 6 +++ .../icon/service/IconDetailService.java | 9 +++++ .../service/impl/IconDetailServiceImpl.java | 40 ++++++++++++++++++- .../icon/vo/request/IconDetailListReq.java | 5 +++ .../icon/vo/request/IconTypeListReq.java | 27 +++++++++++++ .../icon/vo/response/IconDetailListResp.java | 5 +++ .../cn/axzo/oss/common/enums/CodeEnum.java | 3 +- 8 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconTypeListReq.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java index 59089ab..035caec 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/controller/IconDetailController.java @@ -5,8 +5,10 @@ import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq; import cn.axzo.oss.client.icon.vo.request.IconDetailListReq; import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq; import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateStatus; +import cn.axzo.oss.client.icon.vo.request.IconTypeListReq; import cn.axzo.oss.client.icon.vo.response.IconDetailListResp; import cn.azxo.framework.common.model.CommonResponse; +import cn.hutool.json.JSONNull; import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -92,6 +94,19 @@ public class IconDetailController { */ @PostMapping("/list") public CommonResponse> list(@RequestBody IconDetailListReq req) { + log.info("图标列表:req = {}", JSONUtil.toJsonStr(req)); return CommonResponse.success(iconDetailService.list(req)); } + + /** + * 获取所有图标文件格式 + * + * @param req 图标信息 {@link IconTypeListReq} + * @return 图标文件格式列表 + */ + @PostMapping("/getAllTypes") + public CommonResponse> getAllTypes(@RequestBody IconTypeListReq req) { + log.info("获取所有图标文件格式:req = {}", JSONUtil.toJsonStr(req)); + return CommonResponse.success(iconDetailService.getAllTypes(req)); + } } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java index 1835606..6cc890e 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/entity/IconDetail.java @@ -45,6 +45,12 @@ public class IconDetail extends Model { @TableField("name") private String name; + /** + * 图标类型 + */ + @TableField("type") + private String type; + /** * 图标地址 */ diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java index a653881..e76567c 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/IconDetailService.java @@ -4,6 +4,7 @@ import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq; import cn.axzo.oss.client.icon.vo.request.IconDetailListReq; import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq; import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateStatus; +import cn.axzo.oss.client.icon.vo.request.IconTypeListReq; import cn.axzo.oss.client.icon.vo.response.IconDetailListResp; import java.util.List; @@ -55,4 +56,12 @@ public interface IconDetailService { * @return 图标详情 */ IconDetailListResp detailById(Long id); + + /** + * 获取所有图标类型 + * + * @param req 图标类型请求 {@link IconTypeListReq} + * @return 图标类型 + */ + List getAllTypes(IconTypeListReq req); } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java index e15235f..c3d7616 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java @@ -1,6 +1,7 @@ package cn.axzo.oss.client.icon.service.impl; import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.oss.client.icon.entity.IconDetail; import cn.axzo.oss.client.icon.entity.IconGroup; import cn.axzo.oss.client.icon.repository.IconDetailRepository; @@ -9,9 +10,11 @@ import cn.axzo.oss.client.icon.service.IconDetailService; import cn.axzo.oss.client.icon.vo.request.IconDetailAddReq; import cn.axzo.oss.client.icon.vo.request.IconDetailListReq; import cn.axzo.oss.client.icon.vo.request.IconDetailUpdateReq; +import cn.axzo.oss.client.icon.vo.request.IconTypeListReq; import cn.axzo.oss.client.icon.vo.response.IconDetailListResp; import cn.axzo.oss.common.enums.CodeEnum; import cn.axzo.oss.common.exception.BizException; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -20,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -66,7 +70,15 @@ public class IconDetailServiceImpl implements IconDetailService { .one(); // 存在 BizException.error(Objects.isNull(iconDetail), CodeEnum.ICON_EXIST); - return iconDetailRepository.save(BeanMapper.copyBean(req, IconDetail.class, (r, i) -> i.setExt(JSONUtil.toJsonStr(r.getExt())))); + return iconDetailRepository.save(BeanMapper.copyBean(req, IconDetail.class, (r, i) -> { + i.setExt(JSONUtil.toJsonStr(r.getExt())); + // 获取图标格式 + String[] split = r.getName().split("\\."); + if (ArrayUtil.isEmpty(split)){ + throw new ServiceException(CodeEnum.FILE_FORMAT_MAY_ERROR.getMessage()); + } + i.setType(split[split.length-1].toLowerCase()); + })); } /** @@ -140,6 +152,9 @@ public class IconDetailServiceImpl implements IconDetailService { .in(!CollectionUtils.isEmpty(req.getGroupIds()), IconDetail::getGroupId, req.getGroupIds()) .in(!CollectionUtils.isEmpty(req.getIds()), IconDetail::getId, req.getIds()) .like(StringUtils.hasText(req.getName()), IconDetail::getName, req) + .in(!CollectionUtils.isEmpty(req.getTypes()), IconDetail::getType, req.getTypes().stream() + .map(e -> e.trim().toLowerCase()) + .collect(Collectors.toList())) .in(!CollectionUtils.isEmpty(req.getStatuses()), IconDetail::getStatus, req.getStatuses()) .list(); if (CollectionUtils.isEmpty(iconDetailList)) { @@ -183,4 +198,27 @@ public class IconDetailServiceImpl implements IconDetailService { r.setGroupName(iconGroup.getGroup()); }); } + + /** + * 获取图标所有类型 + * + * @param req 查询参数 {@link IconTypeListReq} + * @return 所有类型 {@link List} + */ + @Override + public List getAllTypes(IconTypeListReq req) { + List iconDetailList = iconDetailRepository.lambdaQuery() + .eq(IconDetail::getIsDelete, 0) + .in(!CollectionUtils.isEmpty(req.getGroupIds()), IconDetail::getGroupId, req.getGroupIds().stream() + .distinct() + .collect(Collectors.toList())) + .list(); + if (CollectionUtils.isEmpty(iconDetailList)) { + return Collections.emptyList(); + } + return iconDetailList.stream() + .map(IconDetail::getType) + .distinct() + .collect(Collectors.toList()); + } } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailListReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailListReq.java index fe3cbc1..e334174 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailListReq.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconDetailListReq.java @@ -33,6 +33,11 @@ public class IconDetailListReq { */ private String name; + /** + * 类型,如:svg,png,多个用逗号分隔 + */ + private List types; + /** * 状态,0:正常,1:禁用,多个用逗号分隔 */ diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconTypeListReq.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconTypeListReq.java new file mode 100644 index 0000000..9538050 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/request/IconTypeListReq.java @@ -0,0 +1,27 @@ +package cn.axzo.oss.client.icon.vo.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 图标类型列表请求 + * @author chenwenjian + * @version 1.0 + * @date 2024/3/11 10:39 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IconTypeListReq { + + /** + * 分组ID,多个用逗号分隔 + */ + private List groupIds; + +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java index fd930cd..a58dfe6 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/vo/response/IconDetailListResp.java @@ -45,6 +45,11 @@ public class IconDetailListResp { */ private String name; + /** + * 图标类型,如svg,png + */ + private String type; + /** * 图标地址 */ diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java index 0bd21b9..bcc2e4a 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java @@ -50,7 +50,8 @@ public enum CodeEnum implements EnumBase { ICON_GROUP_EXIST(116, "图标组已存在"), ICON_GROUP_NOT_EXIST(117, "图标组不存在"), - ICON_EXIST(118, "图标已存在") + ICON_EXIST(118, "图标已存在"), + FILE_FORMAT_MAY_ERROR(119, "文件格式可能错误") ; From 4c064e810239a6587c0addbb890ba05be997daa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Mon, 11 Mar 2024 15:34:31 +0800 Subject: [PATCH 35/39] =?UTF-8?q?feat(req-2119):=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=8E=A5=E5=8F=A3---=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 41 +++++++------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 37bb953..31a9cfb 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -312,38 +312,27 @@ public class WebFileController { } } - @SneakyThrows + /** + * 远程下载接口 + * + * @param fileUuId 文件uuid + * @param response HttpServletResponse + */ @GetMapping("/v1/obs/downloadFileFromObs") - @CrossOrigin public void downloadFileFromObs(@RequestParam("fileUuid") String fileUuId, HttpServletResponse response) { ServerFileDownloadDto dto = new ServerFileDownloadDto(); dto.setFileKey(fileUuId); ServerFileDownloadResponse result = fileService.getObject(dto, FileDownloadTypeEnum.STREAM_DOWNLOAD.getCode()); - byte[] buff = new byte[1024]; - InputStream is = null; - OutputStream os = null; - try { - os = response.getOutputStream(); - is = result.getFileStream(); - int i = is.read(buff); - while (i != -1) { - os.write(buff, 0, buff.length); - os.flush(); - i = is.read(buff); - } - log.info("oss下载完成"); - } catch (IOException e2){ - e2.printStackTrace(); - } finally { - if (is != null) { - try { - is.close(); - //os.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } + try (OutputStream outputStream = response.getOutputStream(); InputStream inputStream = result.getFileStream()) { + response.setHeader("content-type","application/octet-stream"); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename=" + result.getFileName() + "." + result.getFileFormat()); + IOUtils.copy(inputStream, outputStream); + log.info("response设置文件流成功"); + } catch (Exception e) { + e.printStackTrace(); } } } From d8503a0c9462f6c48fff135d2e9d2ccde0f60ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Mon, 11 Mar 2024 18:27:26 +0800 Subject: [PATCH 36/39] =?UTF-8?q?add(req-2119):=E9=80=9A=E8=BF=87=E4=B8=B4?= =?UTF-8?q?=E6=97=B6url=E8=AE=BF=E9=97=AEOBS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 16 ++++++- .../common/enums/FileDownloadTypeEnum.java | 3 +- .../cn/axzo/oss/http/api/DownloadFileApi.java | 4 ++ .../oss/http/model/TemporaryUrlAccessRes.java | 44 +++++++++++++++++++ .../integration/s3/HuaWeiCloudService.java | 4 ++ .../s3/impl/HuaWeiCloudServiceImpl.java | 36 +++++++++++++++ .../cn/axzo/oss/manager/api/FileManager.java | 2 + .../response/ServerFileDownloadResponse.java | 5 +++ .../oss/manager/impl/FileManagerImpl.java | 6 +++ .../oss/service/impl/FileServiceImpl.java | 16 +++++-- 10 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/TemporaryUrlAccessRes.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 31a9cfb..6e3f5e8 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -11,7 +11,7 @@ import cn.axzo.oss.common.enums.FileUploadTypeEnum; import cn.axzo.oss.common.enums.StorageUnitEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.BeanConvertUtil; -import cn.axzo.oss.http.model.DownloadFileFromObsRequest; +import cn.axzo.oss.http.model.TemporaryUrlAccessRes; import cn.axzo.oss.http.model.WebFileUploadVo; import cn.axzo.oss.manager.api.dto.request.*; import cn.axzo.oss.manager.api.dto.response.*; @@ -335,4 +335,18 @@ public class WebFileController { e.printStackTrace(); } } + + /** + * 通过临时url访问OBS + * + * @param fileUuId 文件uuid + * @return TemporaryUrlAccessRes + */ + @GetMapping("/v1/obs/temporaryUrlAccess") + public TemporaryUrlAccessRes temporaryUrlAccess(@RequestParam("fileUuid") String fileUuId) { + ServerFileDownloadDto dto = new ServerFileDownloadDto(); + dto.setFileKey(fileUuId); + ServerFileDownloadResponse response = fileService.getObject(dto, FileDownloadTypeEnum.TEMPORARY_URL_ACCESS.getCode()); + return BeanConvertUtil.copyBean(response, TemporaryUrlAccessRes.class); + } } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/FileDownloadTypeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/FileDownloadTypeEnum.java index 0505bba..078e3df 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/FileDownloadTypeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/FileDownloadTypeEnum.java @@ -11,7 +11,8 @@ import lombok.Getter; @Getter public enum FileDownloadTypeEnum { STREAM_DOWNLOAD(1, "流式下载"), - CHECK_POINT_DOWNLOAD(2, "断点续传下载") + CHECK_POINT_DOWNLOAD(2, "断点续传下载"), + TEMPORARY_URL_ACCESS(3, "通过临时url访问OBs") ; private final Integer code; private final String message; diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java index ee97880..b5569ae 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/DownloadFileApi.java @@ -1,5 +1,6 @@ package cn.axzo.oss.http.api; +import cn.axzo.oss.http.model.TemporaryUrlAccessRes; import cn.azxo.framework.common.model.CommonResponse; import feign.Response; import org.springframework.cloud.openfeign.FeignClient; @@ -17,4 +18,7 @@ import org.springframework.web.bind.annotation.RequestParam; public interface DownloadFileApi { @GetMapping(value = "/webApi/v1/obs/downloadFileFromObs") CommonResponse downloadFileFromObs(@RequestParam("fileUuid") String fileUuId); + + @GetMapping(value = "/webApi/v1/obs/temporaryUrlAccess") + CommonResponse temporaryUrlAccess(@RequestParam("fileUuid") String fileUuId); } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/TemporaryUrlAccessRes.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/TemporaryUrlAccessRes.java new file mode 100644 index 0000000..1cc9b82 --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/TemporaryUrlAccessRes.java @@ -0,0 +1,44 @@ +package cn.axzo.oss.http.model; + +import lombok.Data; + +/** + * @author hucf + * @since 2024/3/11 18:21 + **/ +@Data +public class TemporaryUrlAccessRes { + /** + * 文件 URL + */ + private String url; + /** + * 文件 Key + */ + private String fileKey; + + /** + * URL MD5 + */ + private String urlMd5; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件大小 + */ + private Long fileSize; + + /** + * 文件格式 + */ + private String fileFormat; + + /** + * obs:临时url + */ + private String signedUrl; +} diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java index b5fdf01..1ee7ffe 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java @@ -1,5 +1,7 @@ package cn.axzo.oss.integration.s3; +import com.obs.services.model.TemporarySignatureResponse; + import java.io.InputStream; /** @@ -16,4 +18,6 @@ public interface HuaWeiCloudService { String multipartUpload(String bucketName, String fileName, String appCode, InputStream srcStream); InputStream getObject(String bucketName, String objectKey, Integer fileDownloadType); + + TemporarySignatureResponse createTemporarySignature(String bucketName, String objectKey); } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index 194e3cc..95e78fa 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -6,6 +6,7 @@ import cn.axzo.oss.integration.s3.client.HuaWeiCloudObsClient; import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig; import cn.azxo.framework.common.utils.LogUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.json.JSONUtil; import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.*; @@ -16,6 +17,7 @@ import org.springframework.stereotype.Service; import java.io.InputStream; import java.net.URLEncoder; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -284,4 +286,38 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { } return null; } + + /** + * 获取OBS临时url + * + * @param bucketName 桶名称 + * @param objectKey 对象名称 + * @return TemporarySignatureResponse + */ + @Override + public TemporarySignatureResponse createTemporarySignature(String bucketName, String objectKey) { + TemporarySignatureRequest request = new TemporarySignatureRequest(); + // 桶名称 + request.setBucketName(bucketName); + // 对象名称 + request.setObjectKey(objectKey); + // HTTP方法类型 + request.setMethod(HttpMethodEnum.GET); + // 带授权信息的URL的过期时间300秒 + request.setExpires(300L); + // 发起请求的时间 + request.setRequestDate(new Date()); + + try { + ObsClient obsClient = huaWeiCloudObsClient.getClient(); + TemporarySignatureResponse response = obsClient.createTemporarySignature(request); + log.info("response = {}", JSONUtil.toJsonStr(response)); + return response; + } catch (Exception exception) { + log.warn("获取临时url发生异常, exception = {}", exception.getMessage()); + log.warn("异常信息:"); + exception.printStackTrace(); + return null; + } + } } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index 3e67ad2..fdb5380 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -53,4 +53,6 @@ public interface FileManager { String multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file); InputStream downloadObsFile(String bucketName, String objectKey, Integer fileDownloadType); + + String getTempUrlFromOns(String bucketName, String objectKey); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDownloadResponse.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDownloadResponse.java index 047bb63..51a34c6 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDownloadResponse.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDownloadResponse.java @@ -45,4 +45,9 @@ public class ServerFileDownloadResponse { * 文件流 */ private InputStream fileStream; + + /** + * obs:临时url + */ + private String signedUrl; } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index 5b342ef..69d5149 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -9,6 +9,7 @@ import cn.axzo.oss.integration.s3.HuaWeiCloudService; import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.dto.PartETag; import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto; +import com.obs.services.model.TemporarySignatureResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -128,4 +129,9 @@ public class FileManagerImpl implements FileManager { public InputStream downloadObsFile(String bucketName, String objectKey, Integer fileDownloadType) { return huaWeiCloudService.getObject(bucketName, objectKey, fileDownloadType); } + + public String getTempUrlFromOns(String bucketName, String objectKey) { + TemporarySignatureResponse response = huaWeiCloudService.createTemporarySignature(bucketName, objectKey); + return response.getSignedUrl(); + } } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index e219a9a..09281c7 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -717,10 +717,18 @@ public class FileServiceImpl implements FileService { String objectKey = file.getDirectory() + SEPARATOR + file.getFileName(); // 桶名称 String bucketName = file.getBucketName(); - InputStream fileStream = fileManager.downloadObsFile(bucketName, objectKey, fileDownloadType); - if (Objects.isNull(fileStream)) { - log.warn("下载的文件流为空"); + InputStream fileStream = null; + String tempUrlFromOns = null; + if (FileDownloadTypeEnum.TEMPORARY_URL_ACCESS.getCode().equals(fileDownloadType)) { + tempUrlFromOns = fileManager.getTempUrlFromOns(bucketName, objectKey); + } else { + fileStream = fileManager.downloadObsFile(bucketName, objectKey, fileDownloadType); + if (Objects.isNull(fileStream)) { + log.warn("下载的文件流为空"); + } } - return setFileDownloadResponse(file, fileStream); + ServerFileDownloadResponse response = setFileDownloadResponse(file, fileStream); + response.setSignedUrl(tempUrlFromOns); + return response; } } From 31b7e0e3407154891862a719eb6caa008e91a96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Tue, 12 Mar 2024 09:33:47 +0800 Subject: [PATCH 37/39] =?UTF-8?q?add(req-2119):=E9=80=9A=E8=BF=87=E4=B8=B4?= =?UTF-8?q?=E6=97=B6url=E8=AE=BF=E9=97=AEOBS----=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E3=80=81=E5=8A=A0=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/client/controller/WebFileController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 6e3f5e8..eefc50d 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -17,6 +17,7 @@ import cn.axzo.oss.manager.api.dto.request.*; import cn.axzo.oss.manager.api.dto.response.*; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; +import cn.hutool.json.JSONUtil; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; @@ -343,10 +344,12 @@ public class WebFileController { * @return TemporaryUrlAccessRes */ @GetMapping("/v1/obs/temporaryUrlAccess") - public TemporaryUrlAccessRes temporaryUrlAccess(@RequestParam("fileUuid") String fileUuId) { + public CommonResponse temporaryUrlAccess(@RequestParam("fileUuid") String fileUuId) { ServerFileDownloadDto dto = new ServerFileDownloadDto(); dto.setFileKey(fileUuId); ServerFileDownloadResponse response = fileService.getObject(dto, FileDownloadTypeEnum.TEMPORARY_URL_ACCESS.getCode()); - return BeanConvertUtil.copyBean(response, TemporaryUrlAccessRes.class); + TemporaryUrlAccessRes result = BeanConvertUtil.copyBean(response, TemporaryUrlAccessRes.class); + log.info("下载结果, result = {}", JSONUtil.toJsonStr(result)); + return CommonResponse.success(result); } } From b64a8241fff8540b053ccc9c19e7a88ab4ee7569 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Tue, 12 Mar 2024 09:47:08 +0800 Subject: [PATCH 38/39] =?UTF-8?q?feat(icon=5Fmanage):=20=E5=9B=BE=E6=A0=87?= =?UTF-8?q?list=E6=8E=A5=E5=8F=A3NPE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icon/service/impl/IconDetailServiceImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java index c3d7616..e430763 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/icon/service/impl/IconDetailServiceImpl.java @@ -146,15 +146,19 @@ public class IconDetailServiceImpl implements IconDetailService { */ @Override public List list(IconDetailListReq req) { + List finalTypes = null; + if (!CollectionUtils.isEmpty(req.getTypes())) { + finalTypes = req.getTypes().stream() + .map(e -> e.trim().toLowerCase()) + .collect(Collectors.toList()); + } // 查询图标列表 List iconDetailList = iconDetailRepository.lambdaQuery() .eq(IconDetail::getIsDelete, 0) .in(!CollectionUtils.isEmpty(req.getGroupIds()), IconDetail::getGroupId, req.getGroupIds()) .in(!CollectionUtils.isEmpty(req.getIds()), IconDetail::getId, req.getIds()) .like(StringUtils.hasText(req.getName()), IconDetail::getName, req) - .in(!CollectionUtils.isEmpty(req.getTypes()), IconDetail::getType, req.getTypes().stream() - .map(e -> e.trim().toLowerCase()) - .collect(Collectors.toList())) + .in(!CollectionUtils.isEmpty(finalTypes), IconDetail::getType, finalTypes) .in(!CollectionUtils.isEmpty(req.getStatuses()), IconDetail::getStatus, req.getStatuses()) .list(); if (CollectionUtils.isEmpty(iconDetailList)) { From ef5fdcb47f70ce5fa51b678ef3f77f4167cade75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=9C=9D=E9=A3=9E?= Date: Wed, 13 Mar 2024 18:38:09 +0800 Subject: [PATCH 39/39] =?UTF-8?q?add(req-2119):=E5=9B=9E=E9=80=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 09281c7..7f9c23a 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -295,7 +295,7 @@ public class FileServiceImpl implements FileService { ossFile.setAppCode(fileUploadConfig.getAppCode()); ossFile.setChannelCode(fileUploadConfig.getChannelCode()); ossFile.setBucketName(fileUploadConfig.getBucketName()); - ossFile.setDirectory(huaWeiCloudObsConfig.getProfilesActive() + SEPARATOR + fileUploadConfig.getDirectory()); + ossFile.setDirectory(fileUploadConfig.getDirectory()); ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode()); ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); ossFile.setStorageSize(fileUploadConfig.getStorageSize());