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