diff --git a/sql/create_table.sql b/sql/create_table.sql index 643b133..c92302c 100644 --- a/sql/create_table.sql +++ b/sql/create_table.sql @@ -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; \ No newline at end of file +) 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); \ No newline at end of file diff --git a/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java b/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java index 57b7f32..80bc839 100644 --- a/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java +++ b/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java @@ -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 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 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); + } } diff --git a/src/main/java/edu/whut/smilepicturebackend/model/dto/picture/PictureReviewRequest.java b/src/main/java/edu/whut/smilepicturebackend/model/dto/picture/PictureReviewRequest.java new file mode 100644 index 0000000..d62ba8d --- /dev/null +++ b/src/main/java/edu/whut/smilepicturebackend/model/dto/picture/PictureReviewRequest.java @@ -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; +} \ No newline at end of file diff --git a/src/main/java/edu/whut/smilepicturebackend/model/entity/Picture.java b/src/main/java/edu/whut/smilepicturebackend/model/entity/Picture.java index c2a1df0..1de1553 100644 --- a/src/main/java/edu/whut/smilepicturebackend/model/entity/Picture.java +++ b/src/main/java/edu/whut/smilepicturebackend/model/entity/Picture.java @@ -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; + /** * 创建时间 */ diff --git a/src/main/java/edu/whut/smilepicturebackend/model/enums/PictureReviewStatusEnum.java b/src/main/java/edu/whut/smilepicturebackend/model/enums/PictureReviewStatusEnum.java new file mode 100644 index 0000000..3cd7c51 --- /dev/null +++ b/src/main/java/edu/whut/smilepicturebackend/model/enums/PictureReviewStatusEnum.java @@ -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; + } +} diff --git a/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java b/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java index 0d3a3c7..0ba95d8 100644 --- a/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java +++ b/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java @@ -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 { * @param loginUser */ void editPicture(PictureEditRequest pictureEditRequest, User loginUser); + + /** + * 图片审核 + * + * @param pictureReviewRequest + * @param loginUser + */ + void doPictureReview(PictureReviewRequest pictureReviewRequest, User loginUser); + + void fillReviewParams(Picture picture, 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 0a06fa6..2f5550f 100644 --- a/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java +++ b/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java @@ -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 } // 如果是更新,判断图片是否存在 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 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()); + } + } }