3.10 用户传图 审核模块

This commit is contained in:
zhangsan 2025-03-10 18:37:42 +08:00
parent ae943891e8
commit 260e082db7
7 changed files with 189 additions and 10 deletions

View File

@ -46,4 +46,14 @@ create table if not exists picture
INDEX idx_category (category), -- 提升基于分类的查询性能
INDEX idx_tags (tags), -- 提升基于标签的查询性能
INDEX idx_userId (user_id) -- 提升基于用户 ID 的查询性能
) comment '图片' collate = utf8mb4_unicode_ci;
) comment '图片' collate = utf8mb4_unicode_ci;
ALTER TABLE picture
-- 添加新列
ADD COLUMN reviewStatus INT DEFAULT 0 NOT NULL COMMENT '审核状态0-待审核; 1-通过; 2-拒绝',
ADD COLUMN reviewMessage VARCHAR(512) NULL COMMENT '审核信息',
ADD COLUMN reviewerId BIGINT NULL COMMENT '审核人 ID',
ADD COLUMN reviewTime DATETIME NULL COMMENT '审核时间';
-- 创建基于 reviewStatus 列的索引
CREATE INDEX idx_reviewStatus ON picture (reviewStatus);

View File

@ -10,10 +10,7 @@ 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.dto.picture.*;
import edu.whut.smilepicturebackend.model.entity.Picture;
import edu.whut.smilepicturebackend.model.entity.User;
import edu.whut.smilepicturebackend.model.vo.PictureTagCategory;
@ -42,7 +39,7 @@ public class PictureController {
* 上传图片可重新上传
*/
@PostMapping("/upload")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
// @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<PictureVO> uploadPicture(
@RequestPart("file") MultipartFile multipartFile,
PictureUploadRequest pictureUploadRequest,
@ -193,4 +190,17 @@ public class PictureController {
pictureTagCategory.setCategoryList(categoryList);
return ResultUtils.success(pictureTagCategory);
}
/**
* 审核图片
*/
@PostMapping("/review")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> doPictureReview(@RequestBody PictureReviewRequest pictureReviewRequest,
HttpServletRequest request) {
ThrowUtils.throwIf(pictureReviewRequest == null, ErrorCode.PARAMS_ERROR);
User loginUser = userService.getLoginUser(request);
pictureService.doPictureReview(pictureReviewRequest, loginUser);
return ResultUtils.success(true);
}
}

View File

@ -0,0 +1,29 @@
package edu.whut.smilepicturebackend.model.dto.picture;
import lombok.Data;
import java.io.Serializable;
/**
* 图片审核请求
*/
@Data
public class PictureReviewRequest implements Serializable {
/**
* id
*/
private Long id;
/**
* 审核状态0-待审核; 1-通过; 2-拒绝
*/
private Integer reviewStatus;
/**
* 审核信息
*/
private String reviewMessage;
private static final long serialVersionUID = 1L;
}

View File

@ -74,6 +74,26 @@ public class Picture implements Serializable {
*/
private Long userId;
/**
* 审核状态0-待审核; 1-通过; 2-拒绝
*/
private Integer reviewStatus;
/**
* 审核信息
*/
private String reviewMessage;
/**
* 审核人 ID
*/
private Long reviewerId;
/**
* 审核时间
*/
private Date reviewTime;
/**
* 创建时间
*/

View File

@ -0,0 +1,47 @@
package edu.whut.smilepicturebackend.model.enums;
import cn.hutool.core.util.ObjUtil;
import lombok.Getter;
/**
* 图片审核状态枚举类
*/
@Getter
public enum PictureReviewStatusEnum {
REVIEWING("待审核", 0),
PASS("通过", 1),
REJECT("拒绝", 2);
private final String text;
private final int value;
PictureReviewStatusEnum(String text, int value) {
this.text = text;
this.value = value;
}
/**
* 根据 value 获取枚举
*
* @param value 枚举值的 value
* @return 枚举值
*/
public static PictureReviewStatusEnum getEnumByValue(Integer value) {
//判空如果传进来的 value null直接返回 null
if (ObjUtil.isEmpty(value)) {
return null;
}
//遍历当前枚举类的所有常量
for (PictureReviewStatusEnum pictureReviewStatusEnum : PictureReviewStatusEnum.values()) {
//逐个比对内部的 value 字段
if (pictureReviewStatusEnum.value == value) {
//找到匹配的就立即返回对应枚举常量
return pictureReviewStatusEnum;
}
}
//如果没有任何枚举的 value 与之匹配返回 null
return null;
}
}

View File

@ -6,6 +6,7 @@ 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.PictureReviewRequest;
import edu.whut.smilepicturebackend.model.dto.picture.PictureUploadRequest;
import edu.whut.smilepicturebackend.model.entity.Picture;
import edu.whut.smilepicturebackend.model.entity.User;
@ -70,4 +71,14 @@ public interface PictureService extends IService<Picture> {
* @param loginUser
*/
void editPicture(PictureEditRequest pictureEditRequest, User loginUser);
/**
* 图片审核
*
* @param pictureReviewRequest
* @param loginUser
*/
void doPictureReview(PictureReviewRequest pictureReviewRequest, User loginUser);
void fillReviewParams(Picture picture, User loginUser);
}

View File

@ -1,5 +1,6 @@
package edu.whut.smilepicturebackend.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
@ -15,9 +16,11 @@ 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.PictureReviewRequest;
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.enums.PictureReviewStatusEnum;
import edu.whut.smilepicturebackend.model.file.UploadPictureResult;
import edu.whut.smilepicturebackend.model.vo.PictureVO;
import edu.whut.smilepicturebackend.model.vo.UserVO;
@ -76,10 +79,12 @@ public class PictureServiceImpl extends ServiceImpl<PictureMapper, Picture>
}
// 如果是更新判断图片是否存在
if (pictureId != null) {
boolean exists=this.lambdaQuery()
.eq(Picture::getId,pictureId)
.exists();
ThrowUtils.throwIf(!exists, ErrorCode.NOT_FOUND_ERROR, "图片不存在");
Picture oldPicture = this.getById(pictureId);
ThrowUtils.throwIf(oldPicture == null, ErrorCode.NOT_FOUND_ERROR, "图片不存在");
// 仅本人或管理员可编辑图片
if (!oldPicture.getUserId().equals(loginUser.getId()) && !userService.isAdmin(loginUser)) {
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
}
}
// 上传图片得到图片信息
String uploadPathPrefix;
@ -224,6 +229,53 @@ public class PictureServiceImpl extends ServiceImpl<PictureMapper, Picture>
boolean result = this.updateById(picture);
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
}
@Override
public void doPictureReview(PictureReviewRequest pictureReviewRequest, User loginUser) {
// 1. 校验参数
ThrowUtils.throwIf(pictureReviewRequest == null, ErrorCode.PARAMS_ERROR);
Long id = pictureReviewRequest.getId();
Integer reviewStatus = pictureReviewRequest.getReviewStatus();
PictureReviewStatusEnum reviewStatusEnum = PictureReviewStatusEnum.getEnumByValue(reviewStatus);
String reviewMessage = pictureReviewRequest.getReviewMessage();
if (id == null || reviewStatusEnum == null || PictureReviewStatusEnum.REVIEWING.equals(reviewStatusEnum)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
// 2. 判断图片是否存在
Picture oldPicture = this.getById(id);
ThrowUtils.throwIf(oldPicture == null, ErrorCode.NOT_FOUND_ERROR);
// 3. 校验审核状态是否重复已是改状态
if (oldPicture.getReviewStatus().equals(reviewStatus)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请勿重复审核");
}
// 4. 数据库操作
Picture updatePicture = new Picture();
BeanUtil.copyProperties(pictureReviewRequest, updatePicture);
updatePicture.setReviewerId(loginUser.getId()); //审核人
updatePicture.setReviewTime(new Date());
boolean result = this.updateById(updatePicture);
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
}
/**
* 填充审核参数
*
* @param picture
* @param loginUser
*/
@Override
public void fillReviewParams(Picture picture, User loginUser) {
if (userService.isAdmin(loginUser)) {
// 管理员自动过审
picture.setReviewStatus(PictureReviewStatusEnum.PASS.getValue());
picture.setReviewerId(loginUser.getId());
picture.setReviewMessage("管理员自动过审");
picture.setReviewTime(new Date());
} else {
// 非管理员无论是编辑还是创建默认都是待审核
picture.setReviewStatus(PictureReviewStatusEnum.REVIEWING.getValue());
}
}
}