diff --git a/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java b/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java index 5fde1ce..39c60e1 100644 --- a/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java +++ b/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java @@ -294,4 +294,15 @@ public class PictureController { List pictureVOList = pictureService.searchPictureByColor(spaceId, picColor, loginUser); return ResultUtils.success(pictureVOList); } + + /** + * 批量编辑图片 + */ + @PostMapping("/edit/batch") + public BaseResponse editPictureByBatch(@RequestBody PictureEditByBatchRequest pictureEditByBatchRequest, HttpServletRequest request) { + ThrowUtils.throwIf(pictureEditByBatchRequest == null, ErrorCode.PARAMS_ERROR); + User loginUser = userService.getLoginUser(request); + pictureService.editPictureByBatch(pictureEditByBatchRequest, loginUser); + return ResultUtils.success(true); + } } diff --git a/src/main/java/edu/whut/smilepicturebackend/model/dto/picture/PictureEditByBatchRequest.java b/src/main/java/edu/whut/smilepicturebackend/model/dto/picture/PictureEditByBatchRequest.java new file mode 100644 index 0000000..8835223 --- /dev/null +++ b/src/main/java/edu/whut/smilepicturebackend/model/dto/picture/PictureEditByBatchRequest.java @@ -0,0 +1,40 @@ +package edu.whut.smilepicturebackend.model.dto.picture; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 图片批量编辑请求 + */ +@Data +public class PictureEditByBatchRequest implements Serializable { + + /** + * 图片 id 列表 + */ + private List pictureIdList; + + /** + * 空间 id + */ + private Long spaceId; + + /** + * 分类 + */ + private String category; + + /** + * 标签 + */ + private List tags; + + /** + * 命名规则 + */ + private String nameRule; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java b/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java index 571a5ee..18909bc 100644 --- a/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java +++ b/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java @@ -135,4 +135,13 @@ public interface PictureService extends IService { * @return */ List searchPictureByColor(Long spaceId, String picColor, User loginUser); + + /** + * 批量编辑图片 + * + * @param pictureEditByBatchRequest + * @param loginUser + */ + void editPictureByBatch(PictureEditByBatchRequest pictureEditByBatchRequest, User loginUser); + } diff --git a/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java b/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java index ecebce5..e414f4b 100644 --- a/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java +++ b/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java @@ -637,6 +637,70 @@ public class PictureServiceImpl extends ServiceImpl .map(PictureVO::objToVo) .collect(Collectors.toList()); } + + @Override + public void editPictureByBatch(PictureEditByBatchRequest pictureEditByBatchRequest, User loginUser) { + // 1. 获取和校验参数 + List pictureIdList = pictureEditByBatchRequest.getPictureIdList(); + Long spaceId = pictureEditByBatchRequest.getSpaceId(); + String category = pictureEditByBatchRequest.getCategory(); + List tags = pictureEditByBatchRequest.getTags(); + ThrowUtils.throwIf(CollUtil.isEmpty(pictureIdList), ErrorCode.PARAMS_ERROR); + ThrowUtils.throwIf(spaceId == null, ErrorCode.PARAMS_ERROR); + ThrowUtils.throwIf(loginUser == null, ErrorCode.NO_AUTH_ERROR); + // 2. 校验空间权限 + Space space = spaceService.getById(spaceId); + ThrowUtils.throwIf(space == null, ErrorCode.NOT_FOUND_ERROR, "空间不存在"); + if (!space.getUserId().equals(loginUser.getId())) { + throw new BusinessException(ErrorCode.NO_AUTH_ERROR, "没有空间访问权限"); + } + // 3. 查询指定图片(仅选择需要的字段) + List pictureList = this.lambdaQuery() + .select(Picture::getId, Picture::getSpaceId) + .eq(Picture::getSpaceId, spaceId) + .in(Picture::getId, pictureIdList) + .list(); + if (pictureList.isEmpty()) { + return; + } + // 4. 更新分类和标签 + pictureList.forEach(picture -> { + if (StrUtil.isNotBlank(category)) { + picture.setCategory(category); + } + if (CollUtil.isNotEmpty(tags)) { + picture.setTags(JSONUtil.toJsonStr(tags)); + } + }); + // 批量重命名 + String nameRule = pictureEditByBatchRequest.getNameRule(); + fillPictureWithNameRule(pictureList, nameRule); + // 5. 操作数据库进行批量更新 + boolean result = this.updateBatchById(pictureList); + ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR, "批量编辑失败"); + } + + /** + * nameRule 格式:图片-{序号} =>图片-1 图片-2 ... + * + * @param pictureList + * @param nameRule + */ + private void fillPictureWithNameRule(List pictureList, String nameRule) { + if (StrUtil.isBlank(nameRule) || CollUtil.isEmpty(pictureList)) { + return; + } + long count = 1; + try { + for (Picture picture : pictureList) { + String pictureName = nameRule.replaceAll("\\{序号}", String.valueOf(count++)); + picture.setName(pictureName); + } + } catch (Exception e) { + log.error("名称解析错误", e); + throw new BusinessException(ErrorCode.OPERATION_ERROR, "名称解析错误"); + } + } }