From b06162b2966eea4f092b3edf3032de843059af4b Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期四, 12 六月 2025 18:16:10 +0800 Subject: [PATCH] add: 评论开发 --- src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java | 7 + src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java | 6 + src/main/java/com/mzl/flower/service/film/impl/CommentServiceImpl.java | 2 src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java | 5 + src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java | 34 ++++++++ src/main/java/com/mzl/flower/schedule/ScheduleService.java | 56 +++++++++++++ src/main/java/com/mzl/flower/web/film/FilmWorksController.java | 15 +++ src/main/java/com/mzl/flower/dto/request/film/FilmWorksQueryDTO.java | 9 ++ src/main/java/com/mzl/flower/service/film/impl/CommentLikesServiceImpl.java | 29 +++++- src/main/java/com/mzl/flower/service/film/impl/FilmLikesServiceImpl.java | 4 src/main/resources/mapper/film/FilmWorksMapper.xml | 11 ++ src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java | 4 + src/main/java/com/mzl/flower/service/film/FilmWorksService.java | 4 + src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java | 5 + 14 files changed, 180 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmWorksQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmWorksQueryDTO.java index a9742a7..97df9f6 100644 --- a/src/main/java/com/mzl/flower/dto/request/film/FilmWorksQueryDTO.java +++ b/src/main/java/com/mzl/flower/dto/request/film/FilmWorksQueryDTO.java @@ -10,12 +10,21 @@ @ApiModelProperty(value = "中文名称") private String nameCn; + @ApiModelProperty(value = "中文名称") + private String nameEn; + @ApiModelProperty("片场类型(FILMSET_TYPE)") private String type; @ApiModelProperty("发布状态(COMMON_PUBLISH_STATUS)") private String status; + @ApiModelProperty("用户类型") + private String userType; + + @ApiModelProperty("年份") + private String releaseYear; + @ApiModelProperty("分类1-为你精选,2-光影社区") private Integer classify; diff --git a/src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java b/src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java index e70d5b6..6b6404d 100644 --- a/src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java +++ b/src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java @@ -2,7 +2,9 @@ import com.mzl.flower.entity.film.CommentLikes; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; import org.springframework.stereotype.Repository; /** @@ -30,4 +32,9 @@ @Select("select * from comment_likes where create_by = #{userId} and comment_id = #{commentId} ") CommentLikes getCommentLikeByUserIdAndCommentId(String userId, Integer commentId); + + @Update("UPDATE comment_likes SET status = #{status}, update_by = #{updateBy}, update_time = NOW() WHERE id = #{id}") + int updateStatusById(@Param("id") Long id, + @Param("status") Boolean status, + @Param("updateBy") String updateBy); } diff --git a/src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java b/src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java index 7ea15f3..58496d8 100644 --- a/src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java +++ b/src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java @@ -3,7 +3,9 @@ import com.mzl.flower.entity.film.CommentPo; import com.mzl.flower.entity.film.CommentPoExample; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import java.time.LocalDate; import java.util.List; @@ -99,4 +101,8 @@ int updateByPrimaryKey(CommentPo record); List<CommentPo> selectByArticleId(Integer articleId); + + + @Select("SELECT COUNT(*) FROM film_comments WHERE film_id = #{filmId} AND DATE(create_time) = #{date} and deleted = '0' ") + int countByFilmIdAndDate(Long id, LocalDate yesterday); } \ No newline at end of file diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java index 69c1b5e..a1e32e9 100644 --- a/src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java +++ b/src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java @@ -7,6 +7,8 @@ import org.apache.ibatis.annotations.Update; import org.springframework.stereotype.Repository; +import java.time.LocalDate; + /** * <p> * 影视作品收藏表 Mapper 接口 @@ -25,4 +27,7 @@ int updateStatusById(@Param("id") Long id, @Param("status") Boolean status, @Param("updateBy") String updateBy); + + @Select("SELECT COUNT(*) FROM film_collects WHERE film_id = #{filmId} AND DATE(create_time) = #{date} and deleted = '0' ") + int countByFilmIdAndDate(Long id, LocalDate yesterday); } diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java index 6dcfccd..8192fe6 100644 --- a/src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java +++ b/src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java @@ -7,6 +7,8 @@ import org.apache.ibatis.annotations.Update; import org.springframework.stereotype.Repository; +import java.time.LocalDate; + /** * <p> * 影视作品点赞表 Mapper 接口 @@ -26,4 +28,7 @@ int updateStatusById(@Param("id") Long id, @Param("status") Boolean status, @Param("updateBy") String updateBy); + + @Select("SELECT COUNT(*) FROM film_likes WHERE film_id = #{filmId} AND DATE(create_time) = #{date} and deleted = '0' ") + int countByFilmIdAndDate(Long id, LocalDate yesterday); } diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java index 700fe84..e259f11 100644 --- a/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java +++ b/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java @@ -26,4 +26,8 @@ List<FilmWorksVO> queryPage(@Param("dto") FilmWorksQueryDTO dto, Page page); FilmWorksVO selectInfoById(@Param("id") Long id, @Param("userId") String userId); + + //获取权重最高的数据 + @Select("select * from film_works where sticky_weight = (select max(sticky_weight) from film_works) limit 1") + FilmWorks getTopStickyWeight(); } diff --git a/src/main/java/com/mzl/flower/schedule/ScheduleService.java b/src/main/java/com/mzl/flower/schedule/ScheduleService.java index a9e05bd..7159b0c 100644 --- a/src/main/java/com/mzl/flower/schedule/ScheduleService.java +++ b/src/main/java/com/mzl/flower/schedule/ScheduleService.java @@ -1,5 +1,11 @@ package com.mzl.flower.schedule; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.mzl.flower.entity.film.FilmWorks; +import com.mzl.flower.mapper.film.CommentPoMapper; +import com.mzl.flower.mapper.film.FilmCollectsMapper; +import com.mzl.flower.mapper.film.FilmLikesMapper; +import com.mzl.flower.mapper.film.FilmWorksMapper; import com.mzl.flower.service.customer.CustomerService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateFormatUtils; @@ -8,12 +14,24 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.List; + @Component @Slf4j public class ScheduleService { - @Autowired + @Resource private CustomerService customerService; + @Resource + private FilmWorksMapper filmWorksMapper; + @Resource + private FilmLikesMapper filmLikesMapper; + @Resource + private FilmCollectsMapper filmCollectsMapper; + @Resource + private CommentPoMapper commentPoMapper; @Scheduled(cron = "0 15 17 * * ?") @Profile("prod") @@ -28,4 +46,40 @@ customerService.checkVipExpireTime(); } + + //降低置顶权重。每天晚上11点执行一次 + @Scheduled(cron = "0 0 23 * * ?") + public void downFilmWorksStickyWeight() { + // 每日减少10点权重,最低不低于0 + filmWorksMapper.update(null, new LambdaUpdateWrapper<FilmWorks>().setSql("sticky_weight = GREATEST(sticky_weight - 10, 0)")); + log.info("每日置顶权重降低完成"); + } + + //提高置顶权重。每天早上6点执行一次(设计当天点赞+5,评论+10,收藏+10) + @Scheduled(cron = "0 0 6 * * ?") + public void upFilmWorksStickyWeight() { + // 获取昨天(当天)的互动数据 + LocalDate yesterday = LocalDate.now().minusDays(1); + + // 获取所有需要更新的作品 + List<FilmWorks> worksList = filmWorksMapper.selectList(null); + + worksList.forEach(work -> { + // 获取点赞数(需要实现统计方法) + int likes = filmLikesMapper.countByFilmIdAndDate(work.getId(), yesterday); + // 获取评论数(需要实现统计方法) + int comments = filmCollectsMapper.countByFilmIdAndDate(work.getId(), yesterday); + // 获取收藏数(需要实现统计方法) + int collects = commentPoMapper.countByFilmIdAndDate(work.getId(), yesterday); + // 计算权重增量 + int increment = likes * 5 + comments * 10 + collects * 10; + + if (increment > 0) { + filmWorksMapper.update(null, new LambdaUpdateWrapper<FilmWorks>().eq(FilmWorks::getId, work.getId()).setSql("sticky_weight = sticky_weight + " + increment)); + } + }); + log.info("每日互动权重加成完成"); + } + + } diff --git a/src/main/java/com/mzl/flower/service/film/FilmWorksService.java b/src/main/java/com/mzl/flower/service/film/FilmWorksService.java index 06f610d..1601e45 100644 --- a/src/main/java/com/mzl/flower/service/film/FilmWorksService.java +++ b/src/main/java/com/mzl/flower/service/film/FilmWorksService.java @@ -31,6 +31,10 @@ void changeStatus(Long id); + void changeTopState(Long id); + + void changeDownState(Long id); + void batchDelete(BatchDTO dto); void batchPublish(BatchDTO dto); diff --git a/src/main/java/com/mzl/flower/service/film/impl/CommentLikesServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/CommentLikesServiceImpl.java index 392b493..f61c5c7 100644 --- a/src/main/java/com/mzl/flower/service/film/impl/CommentLikesServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/film/impl/CommentLikesServiceImpl.java @@ -1,6 +1,7 @@ package com.mzl.flower.service.film.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.config.security.SecurityUtils; import com.mzl.flower.dto.request.film.CommentLikesDTO; import com.mzl.flower.dto.request.film.CommentLikesQueryDTO; @@ -37,16 +38,32 @@ //查询有没有对应人员的点赞信息 CommentLikes commentLikes = commentLikesMapper.getCommentLikeByUserIdAndCommentId(SecurityUtils.getUserId(), commentLikesDTO.getCommentId()); if (commentLikes == null) { - CommentLikes commentLikes1 = new CommentLikes(); - commentLikes1.setCommentId(commentLikesDTO.getCommentId()); - commentLikes1.setStatus(true); - commentLikes1.create(); - commentLikesMapper.insert(commentLikes1); + commentLikes = new CommentLikes(); + commentLikes.setCommentId(commentLikesDTO.getCommentId()); + commentLikes.setStatus(true); + commentLikes.setCreateBy(SecurityUtils.getUserId()); + commentLikes.create(); + if (commentLikesMapper.insert(commentLikes) <= 0) { + throw new ValidationException("添加评论点赞失败"); + } } else { // 状态取反 commentLikes.setStatus(!commentLikes.getStatus()); commentLikes.update(SecurityUtils.getUserId()); - commentLikesMapper.updateById(commentLikes); + + // 校验主键是否存在 + if (commentLikes.getId() == null) { + throw new ValidationException("主键 ID 不能为空"); + } + int affectedRows = commentLikesMapper.updateStatusById( + commentLikes.getId(), // 确保 id 是 Long 类型 + commentLikes.getStatus(), + SecurityUtils.getUserId() // 更新人 + ); + if (affectedRows <= 0) { + throw new ValidationException("更新作品点赞状态失败"); + } + } } diff --git a/src/main/java/com/mzl/flower/service/film/impl/CommentServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/CommentServiceImpl.java index ecc66c4..fa40148 100644 --- a/src/main/java/com/mzl/flower/service/film/impl/CommentServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/film/impl/CommentServiceImpl.java @@ -279,7 +279,7 @@ //获取用户信息 CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(commentDTO.getCreateBy()); if(!ObjectUtils.isEmpty(currentCustomer)){ - commentDTO.setCommentUserName(currentCustomer.getNickName()); + commentDTO.setCommentUserName(currentCustomer.getName()); commentDTO.setPicture(currentCustomer.getCover()); User user = userService.findByTel(currentCustomer.getTel(), Constants.USER_TYPE.customer.name()); if(!ObjectUtils.isEmpty(user)){ diff --git a/src/main/java/com/mzl/flower/service/film/impl/FilmLikesServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/FilmLikesServiceImpl.java index e9aa6df..c7d9eba 100644 --- a/src/main/java/com/mzl/flower/service/film/impl/FilmLikesServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/film/impl/FilmLikesServiceImpl.java @@ -50,7 +50,7 @@ filmLikes.setStatus(true); filmLikes.setCreateBy(SecurityUtils.getUserId()); if (filmLikesMapper.insert(filmLikes) <= 0) { - throw new ValidationException("添加评论点赞失败"); + throw new ValidationException("添加作品点赞失败"); } } else { // 状态取反 @@ -67,7 +67,7 @@ SecurityUtils.getUserId() // 更新人 ); if (affectedRows <= 0) { - throw new ValidationException("更新评论点赞状态失败"); + throw new ValidationException("更新作品点赞状态失败"); } } return true; diff --git a/src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java index 030f7e2..7c7b4e4 100644 --- a/src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java @@ -122,6 +122,40 @@ filmWorksMapper.updateById(filmWork); } + + @Override + public void changeTopState(Long id) { + FilmWorks filmWork = filmWorksMapper.selectById(id); + if (filmWork == null) { + throw new ValidationException("找不到id为" + id + "的公告"); + } + if (Constants.COMMON_PUBLISH_STATUS.unpublished.name().equals(filmWork.getStatus())) { + throw new ValidationException("未发布作品不能置顶,请先发布"); + } + + FilmWorks filmWorkTop = filmWorksMapper.getTopStickyWeight(); + if (!ObjectUtils.isEmpty(filmWorkTop)) { + filmWork.setStickyWeight(filmWorkTop.getStickyWeight() + 100); + } else { + filmWork.setStickyWeight(100); + } + filmWorksMapper.updateById(filmWork); + } + + + @Override + public void changeDownState(Long id) { + FilmWorks filmWork = filmWorksMapper.selectById(id); + if (filmWork == null) { + throw new ValidationException("找不到id为" + id + "的公告"); + } + if (Constants.COMMON_PUBLISH_STATUS.unpublished.name().equals(filmWork.getStatus())) { + throw new ValidationException("未发布作品无需清除权重"); + } + filmWork.setStickyWeight(0); + filmWorksMapper.updateById(filmWork); + } + @Override public void batchDelete(BatchDTO dto) { filmWorksMapper.deleteBatchIds(dto.getIds()); diff --git a/src/main/java/com/mzl/flower/web/film/FilmWorksController.java b/src/main/java/com/mzl/flower/web/film/FilmWorksController.java index 68117b0..1c26b3e 100644 --- a/src/main/java/com/mzl/flower/web/film/FilmWorksController.java +++ b/src/main/java/com/mzl/flower/web/film/FilmWorksController.java @@ -75,6 +75,21 @@ return returnData(R.SUCCESS.getCode(), null); } + @GetMapping("/filmWorks/setTop") + @ApiOperation(value = "文章置顶", notes = "文章置顶") + public ResponseEntity<ReturnDataDTO> setTop(@NotNull(message = "id不能为空") Long id) { + filmWorksService.changeTopState(id); + return returnData(R.SUCCESS.getCode(), null); + } + + @GetMapping("/filmWorks/setDown") + @ApiOperation(value = "取消置顶", notes = "取消置顶") + public ResponseEntity<ReturnDataDTO> setDown(@NotNull(message = "id不能为空") Long id) { + filmWorksService.changeDownState(id); + return returnData(R.SUCCESS.getCode(), null); + } + + @PostMapping("/filmWorks/delete/batch") @ApiOperation(value = "批量删除", notes = "批量删除") diff --git a/src/main/resources/mapper/film/FilmWorksMapper.xml b/src/main/resources/mapper/film/FilmWorksMapper.xml index 9b19ce0..3c4b493 100644 --- a/src/main/resources/mapper/film/FilmWorksMapper.xml +++ b/src/main/resources/mapper/film/FilmWorksMapper.xml @@ -54,11 +54,20 @@ <if test="dto.nameCn != null and dto.nameCn != ''"> AND t.name_cn LIKE CONCAT('%', #{dto.nameCn}, '%') </if> + <if test="dto.nameEn != null and dto.nameEn != ''"> + AND t.name_en LIKE CONCAT('%', #{dto.nameEn}, '%') + </if> <if test="dto.status != null and dto.status != ''"> AND t.status = #{dto.status} </if> <if test="dto.type != null and dto.type != ''"> AND t.type = #{dto.type} + </if> + <if test="dto.userType != null and dto.userType != ''"> + AND t.user_type = #{dto.userType} + </if> + <if test="dto.releaseYear != null and dto.releaseYear != ''"> + AND t.release_year = #{dto.releaseYear} </if> <if test="dto.classify != null and dto.classify != ''"> AND t.classify = #{dto.classify} @@ -81,7 +90,7 @@ OR t.director LIKE CONCAT('%', #{dto.keywords}, '%')) </if> ORDER BY - t.update_time DESC + t.sticky_weight DESC </select> -- Gitblit v1.9.3