3.10 图片模块增删查改完成
This commit is contained in:
parent
d4464ca14e
commit
ae943891e8
@ -1,6 +1,7 @@
|
|||||||
package edu.whut.smilepicturebackend.controller;
|
package edu.whut.smilepicturebackend.controller;
|
||||||
|
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import edu.whut.smilepicturebackend.annotation.AuthCheck;
|
import edu.whut.smilepicturebackend.annotation.AuthCheck;
|
||||||
import edu.whut.smilepicturebackend.common.BaseResponse;
|
import edu.whut.smilepicturebackend.common.BaseResponse;
|
||||||
import edu.whut.smilepicturebackend.common.DeleteRequest;
|
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.BusinessException;
|
||||||
import edu.whut.smilepicturebackend.exception.ErrorCode;
|
import edu.whut.smilepicturebackend.exception.ErrorCode;
|
||||||
import edu.whut.smilepicturebackend.exception.ThrowUtils;
|
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.PictureUpdateRequest;
|
||||||
import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest;
|
import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest;
|
||||||
import edu.whut.smilepicturebackend.model.entity.Picture;
|
import edu.whut.smilepicturebackend.model.entity.Picture;
|
||||||
import edu.whut.smilepicturebackend.model.entity.User;
|
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.model.vo.PictureVO;
|
||||||
import edu.whut.smilepicturebackend.service.PictureService;
|
import edu.whut.smilepicturebackend.service.PictureService;
|
||||||
import edu.whut.smilepicturebackend.service.UserService;
|
import edu.whut.smilepicturebackend.service.UserService;
|
||||||
@ -23,6 +27,7 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -93,7 +98,7 @@ public class PictureController {
|
|||||||
Picture picture = new Picture();
|
Picture picture = new Picture();
|
||||||
BeanUtils.copyProperties(pictureUpdateRequest, picture);
|
BeanUtils.copyProperties(pictureUpdateRequest, picture);
|
||||||
// 注意将 list 转为 string
|
// 注意将 list 转为 string
|
||||||
//todo:其他地方是否有问题??
|
// List.of("Java", "Python", "AI") --> "["Java", "Python", "AI"]"
|
||||||
picture.setTags(JSONUtil.toJsonStr(pictureUpdateRequest.getTags()));
|
picture.setTags(JSONUtil.toJsonStr(pictureUpdateRequest.getTags()));
|
||||||
// 数据校验
|
// 数据校验
|
||||||
pictureService.validPicture(picture);
|
pictureService.validPicture(picture);
|
||||||
@ -134,4 +139,58 @@ public class PictureController {
|
|||||||
// 获取封装类
|
// 获取封装类
|
||||||
return ResultUtils.success(pictureService.getPictureVO(picture, request));
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
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.PictureQueryRequest;
|
||||||
import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest;
|
import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest;
|
||||||
import edu.whut.smilepicturebackend.model.entity.Picture;
|
import edu.whut.smilepicturebackend.model.entity.Picture;
|
||||||
@ -61,4 +62,12 @@ public interface PictureService extends IService<Picture> {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Page<PictureVO> getPictureVOPage(Page<Picture> picturePage, HttpServletRequest request);
|
Page<PictureVO> getPictureVOPage(Page<Picture> picturePage, HttpServletRequest request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑图片
|
||||||
|
*
|
||||||
|
* @param pictureEditRequest
|
||||||
|
* @param loginUser
|
||||||
|
*/
|
||||||
|
void editPicture(PictureEditRequest pictureEditRequest, User loginUser);
|
||||||
}
|
}
|
||||||
|
@ -3,14 +3,17 @@ package edu.whut.smilepicturebackend.service.impl;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.ObjUtil;
|
import cn.hutool.core.util.ObjUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
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.ErrorCode;
|
||||||
import edu.whut.smilepicturebackend.exception.ThrowUtils;
|
import edu.whut.smilepicturebackend.exception.ThrowUtils;
|
||||||
import edu.whut.smilepicturebackend.manager.FileManager;
|
import edu.whut.smilepicturebackend.manager.FileManager;
|
||||||
import edu.whut.smilepicturebackend.mapper.PictureMapper;
|
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.PictureQueryRequest;
|
||||||
import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest;
|
import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest;
|
||||||
import edu.whut.smilepicturebackend.model.entity.Picture;
|
import edu.whut.smilepicturebackend.model.entity.Picture;
|
||||||
@ -162,24 +165,30 @@ public class PictureServiceImpl extends ServiceImpl<PictureMapper, Picture>
|
|||||||
return pictureVO;
|
return pictureVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页获取图片封装
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Page<PictureVO> getPictureVOPage(Page<Picture> picturePage, HttpServletRequest request) {
|
public Page<PictureVO> getPictureVOPage(Page<Picture> picturePage, HttpServletRequest request) {
|
||||||
|
//从 Page<Picture> 中拿到原始记录和分页元数据
|
||||||
List<Picture> pictureList = picturePage.getRecords();
|
List<Picture> pictureList = picturePage.getRecords();
|
||||||
Page<PictureVO> pictureVOPage = new Page<>(picturePage.getCurrent(), picturePage.getSize(), picturePage.getTotal());
|
Page<PictureVO> pictureVOPage = new Page<>(picturePage.getCurrent(), picturePage.getSize(), picturePage.getTotal());
|
||||||
if (CollUtil.isEmpty(pictureList)) {
|
if (CollUtil.isEmpty(pictureList)) {
|
||||||
return pictureVOPage;
|
return pictureVOPage;
|
||||||
}
|
}
|
||||||
// 对象列表 => 封装对象列表
|
// 实体到 VO 的基本映射
|
||||||
List<PictureVO> pictureVOList = pictureList.stream()
|
List<PictureVO> pictureVOList = pictureList.stream()
|
||||||
.map(PictureVO::objToVo)
|
.map(PictureVO::objToVo)
|
||||||
.collect(Collectors.toList());
|
.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());
|
Set<Long> userIdSet = pictureList.stream().map(Picture::getUserId).collect(Collectors.toSet());
|
||||||
// 1 => user1, 2 => user2
|
// 1 => user1, 2 => user2
|
||||||
Map<Long, List<User>> userIdUserListMap = userService.listByIds(userIdSet).stream()
|
Map<Long, List<User>> userIdUserListMap = userService.listByIds(userIdSet).stream()
|
||||||
.collect(Collectors.groupingBy(User::getId));
|
.collect(Collectors.groupingBy(User::getId));
|
||||||
// 2. 填充信息
|
// 把用户信息填充到 VO
|
||||||
pictureVOList.forEach(pictureVO -> {
|
pictureVOList.forEach(pictureVO -> {
|
||||||
Long userId = pictureVO.getUserId();
|
Long userId = pictureVO.getUserId();
|
||||||
User user = null;
|
User user = null;
|
||||||
@ -191,6 +200,30 @@ public class PictureServiceImpl extends ServiceImpl<PictureMapper, Picture>
|
|||||||
pictureVOPage.setRecords(pictureVOList);
|
pictureVOPage.setRecords(pictureVOList);
|
||||||
return pictureVOPage;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user