From ae943891e8e6fe8aeb51155e9f51b42c933ff315 Mon Sep 17 00:00:00 2001 From: zhangsan <646228430@qq.com> Date: Mon, 10 Mar 2025 12:15:54 +0800 Subject: [PATCH] =?UTF-8?q?3.10=20=E5=9B=BE=E7=89=87=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=9F=A5=E6=94=B9=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PictureController.java | 61 ++++++++++++++++++- .../model/vo/PictureTagCategory.java | 22 +++++++ .../service/PictureService.java | 9 +++ .../service/impl/PictureServiceImpl.java | 41 +++++++++++-- 4 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 src/main/java/edu/whut/smilepicturebackend/model/vo/PictureTagCategory.java diff --git a/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java b/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java index 1288434..57b7f32 100644 --- a/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java +++ b/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java @@ -1,6 +1,7 @@ package edu.whut.smilepicturebackend.controller; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import edu.whut.smilepicturebackend.annotation.AuthCheck; import edu.whut.smilepicturebackend.common.BaseResponse; import edu.whut.smilepicturebackend.common.DeleteRequest; @@ -9,10 +10,13 @@ import edu.whut.smilepicturebackend.constant.UserConstant; import edu.whut.smilepicturebackend.exception.BusinessException; import edu.whut.smilepicturebackend.exception.ErrorCode; import edu.whut.smilepicturebackend.exception.ThrowUtils; +import edu.whut.smilepicturebackend.model.dto.picture.PictureEditRequest; +import edu.whut.smilepicturebackend.model.dto.picture.PictureQueryRequest; import edu.whut.smilepicturebackend.model.dto.picture.PictureUpdateRequest; import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest; import edu.whut.smilepicturebackend.model.entity.Picture; import edu.whut.smilepicturebackend.model.entity.User; +import edu.whut.smilepicturebackend.model.vo.PictureTagCategory; import edu.whut.smilepicturebackend.model.vo.PictureVO; import edu.whut.smilepicturebackend.service.PictureService; import edu.whut.smilepicturebackend.service.UserService; @@ -23,6 +27,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; import java.util.List; @Slf4j @@ -93,7 +98,7 @@ public class PictureController { Picture picture = new Picture(); BeanUtils.copyProperties(pictureUpdateRequest, picture); // 注意将 list 转为 string - //todo:其他地方是否有问题?? + // List.of("Java", "Python", "AI") --> "["Java", "Python", "AI"]" picture.setTags(JSONUtil.toJsonStr(pictureUpdateRequest.getTags())); // 数据校验 pictureService.validPicture(picture); @@ -134,4 +139,58 @@ public class PictureController { // 获取封装类 return ResultUtils.success(pictureService.getPictureVO(picture, request)); } + + /** + * 分页获取图片列表(仅管理员可用) + */ + @PostMapping("/list/page") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> listPictureByPage(@RequestBody PictureQueryRequest pictureQueryRequest) { + long current = pictureQueryRequest.getCurrent(); + long size = pictureQueryRequest.getPageSize(); + // 查询数据库 + Page picturePage = pictureService.page(new Page<>(current, size), + pictureService.getQueryWrapper(pictureQueryRequest)); + return ResultUtils.success(picturePage); + } + + /** + * 分页获取图片列表(封装类,脱敏) + */ + @PostMapping("/list/page/vo") + public BaseResponse> listPictureVOByPage(@RequestBody PictureQueryRequest pictureQueryRequest, + HttpServletRequest request) { + long current = pictureQueryRequest.getCurrent(); + long size = pictureQueryRequest.getPageSize(); + // 限制爬虫,一次不能请求超过20页 + ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR); + // 查询数据库 + Page picturePage = pictureService.page(new Page<>(current, size), + pictureService.getQueryWrapper(pictureQueryRequest)); + // 获取封装类 + return ResultUtils.success(pictureService.getPictureVOPage(picturePage, request)); + } + + /** + * 编辑图片(给用户使用) + */ + @PostMapping("/edit") + public BaseResponse editPicture(@RequestBody PictureEditRequest pictureEditRequest, HttpServletRequest request) { + if (pictureEditRequest == null || pictureEditRequest.getId() <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + User loginUser = userService.getLoginUser(request); + pictureService.editPicture(pictureEditRequest, loginUser); + return ResultUtils.success(true); + } + + @GetMapping("/tag_category") + public BaseResponse listPictureTagCategory() { + PictureTagCategory pictureTagCategory = new PictureTagCategory(); + List tagList = Arrays.asList("热门", "搞笑", "生活", "高清", "艺术", "校园", "背景", "简历", "创意"); + List categoryList = Arrays.asList("模板", "电商", "表情包", "素材", "海报"); + pictureTagCategory.setTagList(tagList); + pictureTagCategory.setCategoryList(categoryList); + return ResultUtils.success(pictureTagCategory); + } } diff --git a/src/main/java/edu/whut/smilepicturebackend/model/vo/PictureTagCategory.java b/src/main/java/edu/whut/smilepicturebackend/model/vo/PictureTagCategory.java new file mode 100644 index 0000000..bf750f9 --- /dev/null +++ b/src/main/java/edu/whut/smilepicturebackend/model/vo/PictureTagCategory.java @@ -0,0 +1,22 @@ +package edu.whut.smilepicturebackend.model.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 图片标签分类列表视图 + */ +@Data +public class PictureTagCategory { + + /** + * 标签列表 + */ + private List tagList; + + /** + * 分类列表 + */ + private List categoryList; +} diff --git a/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java b/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java index ee785eb..0d3a3c7 100644 --- a/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java +++ b/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import edu.whut.smilepicturebackend.model.dto.picture.PictureEditRequest; import edu.whut.smilepicturebackend.model.dto.picture.PictureQueryRequest; import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest; import edu.whut.smilepicturebackend.model.entity.Picture; @@ -61,4 +62,12 @@ public interface PictureService extends IService { * @return */ Page getPictureVOPage(Page picturePage, HttpServletRequest request); + + /** + * 编辑图片 + * + * @param pictureEditRequest + * @param loginUser + */ + void editPicture(PictureEditRequest pictureEditRequest, 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 2b8c082..0a06fa6 100644 --- a/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java +++ b/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java @@ -3,14 +3,17 @@ package edu.whut.smilepicturebackend.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.whut.smilepicturebackend.exception.BusinessException; import edu.whut.smilepicturebackend.exception.ErrorCode; import edu.whut.smilepicturebackend.exception.ThrowUtils; import edu.whut.smilepicturebackend.manager.FileManager; import edu.whut.smilepicturebackend.mapper.PictureMapper; +import edu.whut.smilepicturebackend.model.dto.picture.PictureEditRequest; import edu.whut.smilepicturebackend.model.dto.picture.PictureQueryRequest; import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest; import edu.whut.smilepicturebackend.model.entity.Picture; @@ -162,24 +165,30 @@ public class PictureServiceImpl extends ServiceImpl return pictureVO; } + /** + * 分页获取图片封装 + */ @Override public Page getPictureVOPage(Page picturePage, HttpServletRequest request) { + //从 Page 中拿到原始记录和分页元数据 List pictureList = picturePage.getRecords(); Page pictureVOPage = new Page<>(picturePage.getCurrent(), picturePage.getSize(), picturePage.getTotal()); if (CollUtil.isEmpty(pictureList)) { return pictureVOPage; } - // 对象列表 => 封装对象列表 + // 实体到 VO 的基本映射 List pictureVOList = pictureList.stream() .map(PictureVO::objToVo) .collect(Collectors.toList()); - // 1. 关联查询用户信息 - // 1,2,3,4 + //批量拉取关联的用户信息 + //先从所有 Picture 里摘出不重复的 userId。 + //调 userService.listByIds(...) 一次性把这些用户都查出来,避免 N+1 查询。 + //再把结果按 userId 分组,方便快速根据 ID 拿到对应的 User 对象。 Set userIdSet = pictureList.stream().map(Picture::getUserId).collect(Collectors.toSet()); // 1 => user1, 2 => user2 Map> userIdUserListMap = userService.listByIds(userIdSet).stream() .collect(Collectors.groupingBy(User::getId)); - // 2. 填充信息 + // 把用户信息填充到 VO pictureVOList.forEach(pictureVO -> { Long userId = pictureVO.getUserId(); User user = null; @@ -191,6 +200,30 @@ public class PictureServiceImpl extends ServiceImpl pictureVOPage.setRecords(pictureVOList); return pictureVOPage; } + + @Override + public void editPicture(PictureEditRequest pictureEditRequest, User loginUser) { + // 在此处将实体类和 DTO 进行转换 + Picture picture = new Picture(); + BeanUtils.copyProperties(pictureEditRequest, picture); + // 注意将 list 转为 string + picture.setTags(JSONUtil.toJsonStr(pictureEditRequest.getTags())); + // 设置编辑时间 + picture.setEditTime(new Date()); + // 数据校验 + this.validPicture(picture); + // 判断是否存在 + long id = pictureEditRequest.getId(); + Picture oldPicture = this.getById(id); + ThrowUtils.throwIf(oldPicture == null, ErrorCode.NOT_FOUND_ERROR); + // 校验权限,仅本人及管理员可编辑 + if(!oldPicture.getUserId().equals(loginUser.getId())&&!userService.isAdmin(loginUser)) + throw new BusinessException(ErrorCode.NO_AUTH_ERROR); + + // 操作数据库 + boolean result = this.updateById(picture); + ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR); + } }