3.10 图片模块增删查改完成

This commit is contained in:
zhangsan 2025-03-10 12:15:54 +08:00
parent d4464ca14e
commit ae943891e8
4 changed files with 128 additions and 5 deletions

View File

@ -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<Page<Picture>> listPictureByPage(@RequestBody PictureQueryRequest pictureQueryRequest) {
long current = pictureQueryRequest.getCurrent();
long size = pictureQueryRequest.getPageSize();
// 查询数据库
Page<Picture> picturePage = pictureService.page(new Page<>(current, size),
pictureService.getQueryWrapper(pictureQueryRequest));
return ResultUtils.success(picturePage);
}
/**
* 分页获取图片列表封装类脱敏
*/
@PostMapping("/list/page/vo")
public BaseResponse<Page<PictureVO>> listPictureVOByPage(@RequestBody PictureQueryRequest pictureQueryRequest,
HttpServletRequest request) {
long current = pictureQueryRequest.getCurrent();
long size = pictureQueryRequest.getPageSize();
// 限制爬虫一次不能请求超过20页
ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);
// 查询数据库
Page<Picture> picturePage = pictureService.page(new Page<>(current, size),
pictureService.getQueryWrapper(pictureQueryRequest));
// 获取封装类
return ResultUtils.success(pictureService.getPictureVOPage(picturePage, request));
}
/**
* 编辑图片给用户使用
*/
@PostMapping("/edit")
public BaseResponse<Boolean> 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<PictureTagCategory> listPictureTagCategory() {
PictureTagCategory pictureTagCategory = new PictureTagCategory();
List<String> tagList = Arrays.asList("热门", "搞笑", "生活", "高清", "艺术", "校园", "背景", "简历", "创意");
List<String> categoryList = Arrays.asList("模板", "电商", "表情包", "素材", "海报");
pictureTagCategory.setTagList(tagList);
pictureTagCategory.setCategoryList(categoryList);
return ResultUtils.success(pictureTagCategory);
}
}

View File

@ -0,0 +1,22 @@
package edu.whut.smilepicturebackend.model.vo;
import lombok.Data;
import java.util.List;
/**
* 图片标签分类列表视图
*/
@Data
public class PictureTagCategory {
/**
* 标签列表
*/
private List<String> tagList;
/**
* 分类列表
*/
private List<String> categoryList;
}

View File

@ -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<Picture> {
* @return
*/
Page<PictureVO> getPictureVOPage(Page<Picture> picturePage, HttpServletRequest request);
/**
* 编辑图片
*
* @param pictureEditRequest
* @param loginUser
*/
void editPicture(PictureEditRequest pictureEditRequest, User loginUser);
}

View File

@ -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<PictureMapper, Picture>
return pictureVO;
}
/**
* 分页获取图片封装
*/
@Override
public Page<PictureVO> getPictureVOPage(Page<Picture> picturePage, HttpServletRequest request) {
// Page<Picture> 中拿到原始记录和分页元数据
List<Picture> pictureList = picturePage.getRecords();
Page<PictureVO> pictureVOPage = new Page<>(picturePage.getCurrent(), picturePage.getSize(), picturePage.getTotal());
if (CollUtil.isEmpty(pictureList)) {
return pictureVOPage;
}
// 对象列表 => 封装对象列表
// 实体到 VO 的基本映射
List<PictureVO> pictureVOList = pictureList.stream()
.map(PictureVO::objToVo)
.collect(Collectors.toList());
// 1. 关联查询用户信息
// 1,2,3,4
//批量拉取关联的用户信息
//先从所有 Picture 里摘出不重复的 userId
// userService.listByIds(...) 一次性把这些用户都查出来避免 N+1 查询
//再把结果按 userId 分组方便快速根据 ID 拿到对应的 User 对象
Set<Long> userIdSet = pictureList.stream().map(Picture::getUserId).collect(Collectors.toSet());
// 1 => user1, 2 => user2
Map<Long, List<User>> 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<PictureMapper, Picture>
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);
}
}