3.10 用户传图 审核模块
This commit is contained in:
parent
ae943891e8
commit
260e082db7
@ -47,3 +47,13 @@ create table if not exists picture
|
|||||||
INDEX idx_tags (tags), -- 提升基于标签的查询性能
|
INDEX idx_tags (tags), -- 提升基于标签的查询性能
|
||||||
INDEX idx_userId (user_id) -- 提升基于用户 ID 的查询性能
|
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);
|
@ -10,10 +10,7 @@ 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.*;
|
||||||
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.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.PictureTagCategory;
|
||||||
@ -42,7 +39,7 @@ public class PictureController {
|
|||||||
* 上传图片(可重新上传)
|
* 上传图片(可重新上传)
|
||||||
*/
|
*/
|
||||||
@PostMapping("/upload")
|
@PostMapping("/upload")
|
||||||
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
|
// @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
|
||||||
public BaseResponse<PictureVO> uploadPicture(
|
public BaseResponse<PictureVO> uploadPicture(
|
||||||
@RequestPart("file") MultipartFile multipartFile,
|
@RequestPart("file") MultipartFile multipartFile,
|
||||||
PictureUploadRequest pictureUploadRequest,
|
PictureUploadRequest pictureUploadRequest,
|
||||||
@ -193,4 +190,17 @@ public class PictureController {
|
|||||||
pictureTagCategory.setCategoryList(categoryList);
|
pictureTagCategory.setCategoryList(categoryList);
|
||||||
return ResultUtils.success(pictureTagCategory);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -74,6 +74,26 @@ public class Picture implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核状态:0-待审核; 1-通过; 2-拒绝
|
||||||
|
*/
|
||||||
|
private Integer reviewStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核信息
|
||||||
|
*/
|
||||||
|
private String reviewMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核人 ID
|
||||||
|
*/
|
||||||
|
private Long reviewerId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核时间
|
||||||
|
*/
|
||||||
|
private Date reviewTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,7 @@ 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.PictureEditRequest;
|
||||||
import edu.whut.smilepicturebackend.model.dto.picture.PictureQueryRequest;
|
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.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;
|
||||||
@ -70,4 +71,14 @@ public interface PictureService extends IService<Picture> {
|
|||||||
* @param loginUser
|
* @param loginUser
|
||||||
*/
|
*/
|
||||||
void editPicture(PictureEditRequest pictureEditRequest, User loginUser);
|
void editPicture(PictureEditRequest pictureEditRequest, User loginUser);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片审核
|
||||||
|
*
|
||||||
|
* @param pictureReviewRequest
|
||||||
|
* @param loginUser
|
||||||
|
*/
|
||||||
|
void doPictureReview(PictureReviewRequest pictureReviewRequest, User loginUser);
|
||||||
|
|
||||||
|
void fillReviewParams(Picture picture, User loginUser);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package edu.whut.smilepicturebackend.service.impl;
|
package edu.whut.smilepicturebackend.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
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;
|
||||||
@ -15,9 +16,11 @@ 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.PictureEditRequest;
|
||||||
import edu.whut.smilepicturebackend.model.dto.picture.PictureQueryRequest;
|
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.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.enums.PictureReviewStatusEnum;
|
||||||
import edu.whut.smilepicturebackend.model.file.UploadPictureResult;
|
import edu.whut.smilepicturebackend.model.file.UploadPictureResult;
|
||||||
import edu.whut.smilepicturebackend.model.vo.PictureVO;
|
import edu.whut.smilepicturebackend.model.vo.PictureVO;
|
||||||
import edu.whut.smilepicturebackend.model.vo.UserVO;
|
import edu.whut.smilepicturebackend.model.vo.UserVO;
|
||||||
@ -76,10 +79,12 @@ public class PictureServiceImpl extends ServiceImpl<PictureMapper, Picture>
|
|||||||
}
|
}
|
||||||
// 如果是更新,判断图片是否存在
|
// 如果是更新,判断图片是否存在
|
||||||
if (pictureId != null) {
|
if (pictureId != null) {
|
||||||
boolean exists=this.lambdaQuery()
|
Picture oldPicture = this.getById(pictureId);
|
||||||
.eq(Picture::getId,pictureId)
|
ThrowUtils.throwIf(oldPicture == null, ErrorCode.NOT_FOUND_ERROR, "图片不存在");
|
||||||
.exists();
|
// 仅本人或管理员可编辑图片
|
||||||
ThrowUtils.throwIf(!exists, ErrorCode.NOT_FOUND_ERROR, "图片不存在");
|
if (!oldPicture.getUserId().equals(loginUser.getId()) && !userService.isAdmin(loginUser)) {
|
||||||
|
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// 上传图片,得到图片信息
|
// 上传图片,得到图片信息
|
||||||
String uploadPathPrefix;
|
String uploadPathPrefix;
|
||||||
@ -224,6 +229,53 @@ public class PictureServiceImpl extends ServiceImpl<PictureMapper, Picture>
|
|||||||
boolean result = this.updateById(picture);
|
boolean result = this.updateById(picture);
|
||||||
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user