From fb514e661e644bc40dba3d2413a64ff5e86bf6be Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期三, 11 六月 2025 11:02:29 +0800
Subject: [PATCH] add: 点赞、收藏功能补充

---
 src/main/resources/mapper/film/FilmCollectsMapper.xml                       |    5 
 src/main/java/com/mzl/flower/dto/request/film/FilmLikesQueryDTO.java        |    7 
 src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java               |   11 +
 src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java    |   21 +
 src/main/java/com/mzl/flower/web/film/FilmCollectsController.java           |   55 +++++
 src/main/java/com/mzl/flower/dto/response/film/FilmWorksVO.java             |   18 +
 src/main/java/com/mzl/flower/entity/film/FilmCollects.java                  |   29 ++
 src/main/java/com/mzl/flower/dto/request/film/FilmCollectsQueryDTO.java     |   18 +
 src/main/java/com/mzl/flower/dto/request/film/FilmWorksQueryDTO.java        |    7 
 src/main/java/com/mzl/flower/service/film/impl/FilmLikesServiceImpl.java    |   23 +
 src/main/resources/mapper/film/FilmWorksMapper.xml                          |   92 ++++++++
 src/main/java/com/mzl/flower/service/film/impl/FilmCollectsServiceImpl.java |   83 +++++++
 src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java               |    1 
 src/main/java/com/mzl/flower/dto/request/film/FilmLikesDTO.java             |   89 --------
 src/main/java/com/mzl/flower/dto/request/film/FilmCollectsDTO.java          |   20 +
 src/main/java/com/mzl/flower/service/film/FilmCollectsService.java          |   26 ++
 src/main/java/com/mzl/flower/dto/response/film/FilmLikesVO.java             |   48 ----
 src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java            |   28 ++
 src/main/java/com/mzl/flower/dto/response/film/FilmCollectsVO.java          |   27 ++
 19 files changed, 463 insertions(+), 145 deletions(-)

diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmCollectsDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmCollectsDTO.java
new file mode 100644
index 0000000..c771a70
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/film/FilmCollectsDTO.java
@@ -0,0 +1,20 @@
+package com.mzl.flower.dto.request.film;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+public class FilmCollectsDTO {
+    /**
+     * 关联的影视作品ID
+     */
+    private Integer filmId;
+
+    /**
+     * 收藏状态(0取消,1有效)
+     */
+    private Boolean status;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmCollectsQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmCollectsQueryDTO.java
new file mode 100644
index 0000000..b65aeb0
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/film/FilmCollectsQueryDTO.java
@@ -0,0 +1,18 @@
+package com.mzl.flower.dto.request.film;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class FilmCollectsQueryDTO {
+
+    @ApiModelProperty("影视作品ID")
+    private Integer filmId;
+
+    @ApiModelProperty("状态")
+    private Boolean status;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmLikesDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmLikesDTO.java
index fde8c23..5e1ee63 100644
--- a/src/main/java/com/mzl/flower/dto/request/film/FilmLikesDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/film/FilmLikesDTO.java
@@ -13,94 +13,7 @@
     private Integer filmId;
 
     /**
-     * 拍摄地点名称
-     */
-    private String locationName;
-
-    /**
-     * 详细地址
-     */
-    private String address;
-
-    /**
-     * 纬度坐标(精确到小数点后6位)
-     */
-    private BigDecimal gpsLat;
-
-    /**
-     * 经度坐标(精确到小数点后6位)
-     */
-    private BigDecimal gpsLng;
-
-    /**
-     * 拍摄开始日期
-     */
-    private LocalDate startDate;
-
-    /**
-     * 拍摄结束日期
-     */
-    private LocalDate endDate;
-
-    /**
-     * 场景类型
-     */
-    private String sceneType;
-
-    /**
-     * 经典画面描述
-     */
-    private String classicScene;
-
-    /**
-     * 是否开放参观(0否,1是)
-     */
-    private Boolean isOpenVisit;
-
-    /**
-     * 参观提示(JSON格式存储)
-     */
-    private String visitInfo;
-
-    /**
-     * 地标性建筑描述
-     */
-    private String landmarkDesc;
-
-    /**
-     * 交通指引说明
-     */
-    private String transportGuide;
-
-    /**
-     * 停车场信息
-     */
-    private String parkingInfo;
-
-    /**
-     * 周边设施描述
-     */
-    private String surroundingFacilities;
-
-    /**
-     * AR实景对比功能入口URL
-     */
-    private String arEntry;
-
-    /**
-     * 状态(0禁用,1启用)
+     * 收藏状态(0取消,1有效)
      */
     private Boolean status;
-
-
-    /**
-     * 打卡记录量
-     */
-    private Integer checkinCount;
-
-    /**
-     * 游客实拍图(存储JSON数组)
-     */
-    private String visitorPhotos;
-
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmLikesQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmLikesQueryDTO.java
index 1f26dbf..2828458 100644
--- a/src/main/java/com/mzl/flower/dto/request/film/FilmLikesQueryDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/film/FilmLikesQueryDTO.java
@@ -5,6 +5,9 @@
 
 @Data
 public class FilmLikesQueryDTO {
-    @ApiModelProperty(value = "会员等级名称")
-    private String name;
+    @ApiModelProperty("影视作品ID")
+    private Integer filmId;
+
+    @ApiModelProperty("状态")
+    private Boolean status;
 }
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 d00ec48..a9742a7 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
@@ -33,4 +33,11 @@
 
     @ApiModelProperty(value = "关键字(中文名称、英文名称、导演、演员、剧情、动作)")
     private String keywords;
+
+    private String userId;
+
+    private Integer id;
+
+
+
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/film/FilmCollectsVO.java b/src/main/java/com/mzl/flower/dto/response/film/FilmCollectsVO.java
new file mode 100644
index 0000000..737dc82
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/film/FilmCollectsVO.java
@@ -0,0 +1,27 @@
+package com.mzl.flower.dto.response.film;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class FilmCollectsVO extends AbstractTransDTO {
+    private Long id;
+
+    @ApiModelProperty("影视作品ID")
+    private Integer filmId;
+
+    @ApiModelProperty("状态")
+    private Boolean status;
+
+    @ApiModelProperty("创建日期")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改日期")
+    private LocalDateTime updateTime;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/film/FilmLikesVO.java b/src/main/java/com/mzl/flower/dto/response/film/FilmLikesVO.java
index 10ff0ab..c25e0da 100644
--- a/src/main/java/com/mzl/flower/dto/response/film/FilmLikesVO.java
+++ b/src/main/java/com/mzl/flower/dto/response/film/FilmLikesVO.java
@@ -5,61 +5,21 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
 public class FilmLikesVO extends AbstractTransDTO {
     private Long id;
 
-    @ApiModelProperty("会员等级名称")
-    private String name;
+    @ApiModelProperty("影视作品ID")
+    private Integer filmId;
 
-    @ApiModelProperty("成长点-区间-开始")
-    private int startPoint;
-
-    @ApiModelProperty("成长点-区间-结束")
-    private int endPoint;
-
-    @ApiModelProperty("会员折扣类型(百分比、固定金额)")
-    @DictTrans(target = "discountTypeStr", codeType = "DISCOUNT_TYPE")
-    private String discountType;
-
-    private String discountTypeStr;
-
-    @ApiModelProperty("会员折扣百分比")
-    private BigDecimal discountRatio;
-
-    @ApiModelProperty("会员折扣固定金额")
-    private BigDecimal discountAmount;
-
-    @ApiModelProperty("消费金额(元)")
-    private int consumptionAmount;
-
-    @ApiModelProperty("已消费产生的成长值")
-    private int growthValue;
-
-    @ApiModelProperty("未消费产生的下降值")
-    private int downgradeValue;
+    @ApiModelProperty("状态")
+    private Boolean status;
 
     @ApiModelProperty("创建日期")
     private LocalDateTime createTime;
 
     @ApiModelProperty("修改日期")
     private LocalDateTime updateTime;
-
-    @ApiModelProperty("操作人")
-    private String createName;
-
-    @ApiModelProperty("背景")
-    private String background;
-
-    @ApiModelProperty("图片")
-    private String pictures;
-
-    @ApiModelProperty(value = "会员成长值获取规则")
-    private String growthValueDesc;
-
-    @ApiModelProperty("更新人")
-    private String updateBy;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/film/FilmWorksVO.java b/src/main/java/com/mzl/flower/dto/response/film/FilmWorksVO.java
index 4cb8789..811d30b 100644
--- a/src/main/java/com/mzl/flower/dto/response/film/FilmWorksVO.java
+++ b/src/main/java/com/mzl/flower/dto/response/film/FilmWorksVO.java
@@ -145,5 +145,23 @@
     private String filmPictures;
 
 
+    private Boolean liked;
+
+    private Boolean collected;
+
+    /**
+     * 收藏量
+     */
+    private Integer voCollectCount;
+
+    /**
+     * 点赞量
+     */
+    private Integer voLikeCount;
+
+    /**
+     * 评论量
+     */
+    private Integer voCommentCount;
 
 }
diff --git a/src/main/java/com/mzl/flower/entity/film/FilmCollects.java b/src/main/java/com/mzl/flower/entity/film/FilmCollects.java
new file mode 100644
index 0000000..43df8a0
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/film/FilmCollects.java
@@ -0,0 +1,29 @@
+package com.mzl.flower.entity.film;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import lombok.Data;
+
+/**
+ * 影视作品收藏表
+ *
+ * @author generator@Fang
+ * @since 2025-05-29
+ */
+@Data
+@TableName("film_collects")
+public class FilmCollects extends BaseAutoEntity {
+
+
+    /**
+     * 关联的影视作品ID
+     */
+    private Integer filmId;
+
+    /**
+     * 收藏状态(0取消,1有效)
+     */
+    private Boolean status;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java
new file mode 100644
index 0000000..69c1b5e
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmCollectsMapper.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.mapper.film;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mzl.flower.entity.film.FilmCollects;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 影视作品收藏表 Mapper 接口
+ * </p>
+ *
+ * @author generator@Fang
+ * @since 2025-05-29
+ */
+@Repository
+public interface FilmCollectsMapper extends BaseMapper<FilmCollects> {
+
+    @Select("select * from film_collects where film_id = #{filmId} and create_by = #{createBy}")
+    FilmCollects getFilmCollectsByfilmIdAndCreateBy(Integer filmId, String createBy);
+
+    @Update("UPDATE film_collects 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/FilmLikesMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java
index 81f01a2..6dcfccd 100644
--- a/src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java
@@ -2,6 +2,9 @@
 
 import com.mzl.flower.entity.film.FilmLikes;
 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;
 
 /**
@@ -15,4 +18,12 @@
 @Repository
 public interface FilmLikesMapper extends BaseMapper<FilmLikes> {
 
+
+    @Select("select * from film_likes where film_id = #{filmId} and create_by = #{createBy}")
+    FilmLikes getFilmLikesByfilmIdAndCreateBy(Integer filmId, String createBy);
+
+    @Update("UPDATE film_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/FilmWorksMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java
index 2abdb5f..700fe84 100644
--- a/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java
@@ -25,4 +25,5 @@
     List<FilmWorksVO> getFilmWorksAll();
 
     List<FilmWorksVO> queryPage(@Param("dto") FilmWorksQueryDTO dto, Page page);
+    FilmWorksVO selectInfoById(@Param("id") Long id, @Param("userId") String userId);
 }
diff --git a/src/main/java/com/mzl/flower/service/film/FilmCollectsService.java b/src/main/java/com/mzl/flower/service/film/FilmCollectsService.java
new file mode 100644
index 0000000..2667734
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/FilmCollectsService.java
@@ -0,0 +1,26 @@
+package com.mzl.flower.service.film;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.dto.request.film.FilmCollectsDTO;
+import com.mzl.flower.dto.request.film.FilmCollectsQueryDTO;
+import com.mzl.flower.dto.response.film.FilmCollectsVO;
+import com.mzl.flower.entity.film.FilmCollects;
+
+/**
+ * <p>
+ * 影视作品点赞表 服务类
+ * </p>
+ *
+ * @author generator@Fang
+ * @since 2025-05-29
+ */
+public interface FilmCollectsService extends IService<FilmCollects> {
+
+    void saveFilmCollects(FilmCollectsDTO filmCollectsDTO);
+
+    Boolean updateFilmCollects(FilmCollectsDTO filmCollectsDTO);
+    void deleteFilmCollects(String id);
+
+    Page<FilmCollectsVO> queryPage(FilmCollectsQueryDTO filmCollectsQueryDTO, Page page);
+}
diff --git a/src/main/java/com/mzl/flower/service/film/impl/FilmCollectsServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/FilmCollectsServiceImpl.java
new file mode 100644
index 0000000..5b66fb0
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/impl/FilmCollectsServiceImpl.java
@@ -0,0 +1,83 @@
+package com.mzl.flower.service.film.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.dto.request.film.FilmCollectsDTO;
+import com.mzl.flower.dto.request.film.FilmCollectsQueryDTO;
+import com.mzl.flower.dto.response.film.FilmCollectsVO;
+import com.mzl.flower.entity.film.FilmCollects;
+import com.mzl.flower.mapper.film.FilmCollectsMapper;
+import com.mzl.flower.service.film.FilmCollectsService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 影视作品收藏表 服务实现类
+ * </p>
+ *
+ * @author generator@Fang
+ * @since 2025-05-29
+ */
+@Service
+public class FilmCollectsServiceImpl extends ServiceImpl<FilmCollectsMapper, FilmCollects> implements FilmCollectsService {
+
+    @Resource
+     private FilmCollectsMapper filmCollectsMapper;
+
+    @Override
+    public void saveFilmCollects(FilmCollectsDTO filmCollectsDTO) {
+        FilmCollects filmCollects = new FilmCollects();
+        filmCollects.setFilmId(filmCollectsDTO.getFilmId());
+        filmCollects.setStatus(true);
+        if (filmCollectsMapper.insert(filmCollects) <= 0) {
+            throw new ValidationException("添加评论收藏失败");
+        }
+    }
+
+    @Override
+    public Boolean updateFilmCollects(FilmCollectsDTO filmCollectsDTO) {
+        // 没有,新增
+        FilmCollects filmCollects  = filmCollectsMapper.getFilmCollectsByfilmIdAndCreateBy(filmCollectsDTO.getFilmId(), SecurityUtils.getUserId());
+        if (filmCollects == null) {
+            filmCollects = new FilmCollects();
+            filmCollects.setFilmId(filmCollectsDTO.getFilmId());
+            filmCollects.setStatus(true);
+            filmCollects.setCreateBy(SecurityUtils.getUserId());
+            if (filmCollectsMapper.insert(filmCollects) <= 0) {
+                throw new ValidationException("添加评论收藏失败");
+            }
+        } else {
+            // 状态取反
+            filmCollects.setStatus(!filmCollects.getStatus());
+            filmCollects.update(SecurityUtils.getUserId());
+            // 校验主键是否存在
+            if (filmCollects.getId() == null) {
+                throw new ValidationException("主键 ID 不能为空");
+            }
+            int affectedRows = filmCollectsMapper.updateStatusById(
+                    filmCollects.getId(),         // 确保 id 是 Long 类型
+                    filmCollects.getStatus(),
+                    SecurityUtils.getUserId()  // 更新人
+            );
+            if (affectedRows <= 0) {
+                throw new ValidationException("更新评论点赞状态失败");
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void deleteFilmCollects(String id) {
+
+    }
+
+    @Override
+    public Page<FilmCollectsVO> queryPage(FilmCollectsQueryDTO filmCollectsQueryDTO, Page page) {
+        return null;
+    }
+}
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 6a511bb..e9aa6df 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
@@ -2,6 +2,7 @@
 
 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.FilmLikesDTO;
 import com.mzl.flower.dto.request.film.FilmLikesQueryDTO;
 import com.mzl.flower.dto.response.film.FilmLikesVO;
@@ -40,20 +41,32 @@
 
     @Override
     public Boolean updateFilmLikes(FilmLikesDTO filmLikesDTO) {
-        LocalDateTime now = LocalDateTime.now();
+
         // 没有,新增
-        FilmLikes filmLikes = null;
-        if (filmLikesDTO == null) {
+        FilmLikes filmLikes = filmLikesMapper.getFilmLikesByfilmIdAndCreateBy(filmLikesDTO.getFilmId(), SecurityUtils.getUserId());
+        if (filmLikes == null) {
             filmLikes = new FilmLikes();
             filmLikes.setFilmId(filmLikesDTO.getFilmId());
             filmLikes.setStatus(true);
+            filmLikes.setCreateBy(SecurityUtils.getUserId());
             if (filmLikesMapper.insert(filmLikes) <= 0) {
                 throw new ValidationException("添加评论点赞失败");
             }
         } else {
             // 状态取反
-            filmLikesDTO.setStatus(!filmLikesDTO.getStatus());
-            if (filmLikesMapper.updateById(filmLikes) <= 0) {
+            filmLikes.setStatus(!filmLikes.getStatus());
+            filmLikes.update(SecurityUtils.getUserId());
+
+            // 校验主键是否存在
+            if (filmLikes.getId() == null) {
+                throw new ValidationException("主键 ID 不能为空");
+            }
+            int affectedRows = filmLikesMapper.updateStatusById(
+                    filmLikes.getId(),         // 确保 id 是 Long 类型
+                    filmLikes.getStatus(),
+                    SecurityUtils.getUserId()  // 更新人
+            );
+            if (affectedRows <= 0) {
                 throw new ValidationException("更新评论点赞状态失败");
             }
         }
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 4fa277e..030f7e2 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
@@ -87,8 +87,18 @@
         if(StringUtils.isNotBlank(dto.getCreateDateEndStr())){
             dto.setCreateDateEnd(DateUtils.dateToLocalDateTime(dto.getCreateDateEndStr(),false));
         }
+
+        //todo 这里的用户ID可能为空,用户存在不登录的情况下访问,传null
+        try {
+            dto.setUserId(SecurityUtils.getUserId());
+        } catch (Exception e) {
+            dto.setUserId(null);
+        }
+
         List<FilmWorksVO> list =  filmWorksMapper.queryPage(dto,page);
         page.setRecords(list);
+
+
         return page;
     }
 
@@ -129,13 +139,14 @@
 
     @Override
     public FilmWorksVO detail(Long id) {
-        FilmWorks filmWork = filmWorksMapper.selectById(id);
-        if(filmWork==null){
+        // userId 可以是空,因为用户可以登录
+
+        String userId = SecurityUtils.getUserId();
+        FilmWorksVO filmWorksVO = filmWorksMapper.selectInfoById(id,userId);
+        if(filmWorksVO==null){
             return null;
         }
-        FilmWorksVO filmWorksVO = new FilmWorksVO();
-        BeanUtils.copyProperties(filmWork,filmWorksVO);
-        CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(filmWork.getCreateBy());
+        CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(filmWorksVO.getCreateBy());
         filmWorksVO.setNickname(currentCustomer.getNickName());
         filmWorksVO.setAvatar(currentCustomer.getCover());
         return filmWorksVO;
diff --git a/src/main/java/com/mzl/flower/web/film/FilmCollectsController.java b/src/main/java/com/mzl/flower/web/film/FilmCollectsController.java
new file mode 100644
index 0000000..b3ce33a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/film/FilmCollectsController.java
@@ -0,0 +1,55 @@
+package com.mzl.flower.web.film;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.dto.request.film.FilmCollectsDTO;
+import com.mzl.flower.dto.request.film.FilmCollectsQueryDTO;
+import com.mzl.flower.dto.response.film.FilmCollectsVO;
+import com.mzl.flower.service.film.FilmCollectsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+
+
+@Api(value = "影视作品收藏", tags = "影视作品收藏")
+@RestController
+@RequestMapping("/v2/film-collects")
+@RequiredArgsConstructor
+public class FilmCollectsController extends BaseController {
+
+    private final FilmCollectsService filmCollectsService;
+
+    @GetMapping("/filmCollects/list")
+    @ApiOperation(value = "影视作品收藏列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<Page<FilmCollectsVO>>> getFilmCollectsList(Page page, FilmCollectsQueryDTO dto) {
+        return returnData(R.SUCCESS.getCode(), filmCollectsService.queryPage(dto, page));
+    }
+
+    @GetMapping(value = "/filmCollects/delete")
+    @ApiOperation(value = "删除影视作品收藏 ", httpMethod = "GET", notes = "ID")
+    public ResponseEntity delete(@NotNull(message = "id不能为空") Long id) {
+        filmCollectsService.deleteFilmCollects(String.valueOf(id));
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/filmCollects/new")
+    @ApiOperation(value = "保存影视作品收藏", httpMethod = "POST")
+    public ResponseEntity insert(@RequestBody FilmCollectsDTO filmCollectsDTO) {
+        filmCollectsService.saveFilmCollects(filmCollectsDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/filmCollects/edit")
+    @ApiOperation(value = "更新影视作品收藏", httpMethod = "POST")
+    public ResponseEntity update(@RequestBody FilmCollectsDTO filmCollectsDTO) {
+        filmCollectsService.updateFilmCollects(filmCollectsDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+}
diff --git a/src/main/resources/mapper/film/FilmCollectsMapper.xml b/src/main/resources/mapper/film/FilmCollectsMapper.xml
new file mode 100644
index 0000000..bd18a86
--- /dev/null
+++ b/src/main/resources/mapper/film/FilmCollectsMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mzl.flower.mapper.film.FilmCollectsMapper">
+
+</mapper>
diff --git a/src/main/resources/mapper/film/FilmWorksMapper.xml b/src/main/resources/mapper/film/FilmWorksMapper.xml
index 45a3347..9b19ce0 100644
--- a/src/main/resources/mapper/film/FilmWorksMapper.xml
+++ b/src/main/resources/mapper/film/FilmWorksMapper.xml
@@ -6,15 +6,51 @@
         SELECT
         t.*,
         c.name AS  nickname,
-        c.cover AS  avatar
+        c.cover AS  avatar,
+        COALESCE(l.like_count, 0) AS vo_like_count,
+        COALESCE(com.comment_count, 0) AS vo_comment_count,
+        COALESCE(col.collect_count, 0) AS vo_collect_count,
+        CASE WHEN l_user.status = 1 THEN 1 ELSE 0 END AS liked,
+        CASE WHEN col_user.status = 1 THEN 1 ELSE 0 END AS collected
         FROM
         film_works t
         LEFT JOIN
         t_customer_info c
         ON
         t.create_by = c.user_id
+        LEFT JOIN (
+        SELECT film_id, COUNT(*) AS like_count
+        FROM film_likes
+        WHERE status = 1
+        GROUP BY film_id
+        ) l ON t.id = l.film_id
+        LEFT JOIN (
+        SELECT film_id, COUNT(*) AS comment_count
+        FROM film_comments
+        WHERE state = 1
+        GROUP BY film_id
+        ) com ON t.id = com.film_id
+        LEFT JOIN (
+        SELECT film_id, COUNT(*) AS collect_count
+        FROM film_collects
+        WHERE status = 1
+        GROUP BY film_id
+        ) col ON t.id = col.film_id
+        LEFT JOIN (
+        SELECT film_id, status
+        FROM film_likes
+        WHERE create_by = #{dto.userId}
+        ) l_user ON t.id = l_user.film_id
+        LEFT JOIN (
+        SELECT film_id, status
+        FROM film_collects
+        WHERE create_by = #{dto.userId}
+        ) col_user ON t.id = col_user.film_id
         WHERE
         t.deleted = 0
+        <if test="dto.id != null and dto.id != ''">
+            AND t.id  = #{dto.id}
+        </if>
         <if test="dto.nameCn != null and dto.nameCn != ''">
             AND t.name_cn LIKE CONCAT('%', #{dto.nameCn}, '%')
         </if>
@@ -48,4 +84,58 @@
         t.update_time DESC
     </select>
 
+
+    <select id="selectInfoById" resultType="com.mzl.flower.dto.response.film.FilmWorksVO">
+        SELECT
+        t.*,
+        c.name AS  nickname,
+        c.cover AS  avatar,
+        COALESCE(l.like_count, 0) AS vo_like_count,
+        COALESCE(com.comment_count, 0) AS vo_comment_count,
+        COALESCE(col.collect_count, 0) AS vo_collect_count,
+        CASE WHEN l_user.status = 1 THEN 1 ELSE 0 END AS liked,
+        CASE WHEN col_user.status = 1 THEN 1 ELSE 0 END AS collected
+        FROM
+        film_works t
+        LEFT JOIN
+        t_customer_info c
+        ON
+        t.create_by = c.user_id
+        LEFT JOIN (
+        SELECT film_id, COUNT(*) AS like_count
+        FROM film_likes
+        WHERE status = 1
+        GROUP BY film_id
+        ) l ON t.id = l.film_id
+        LEFT JOIN (
+        SELECT film_id, COUNT(*) AS comment_count
+        FROM film_comments
+        WHERE state = 1
+        GROUP BY film_id
+        ) com ON t.id = com.film_id
+        LEFT JOIN (
+        SELECT film_id, COUNT(*) AS collect_count
+        FROM film_collects
+        WHERE status = 1
+        GROUP BY film_id
+        ) col ON t.id = col.film_id
+        LEFT JOIN (
+        SELECT film_id, status
+        FROM film_likes
+        WHERE create_by = #{userId}
+        ) l_user ON t.id = l_user.film_id
+        LEFT JOIN (
+        SELECT film_id, status
+        FROM film_collects
+        WHERE create_by = #{userId}
+        ) col_user ON t.id = col_user.film_id
+        WHERE
+        t.deleted = 0
+        <if test="id != null and id != ''">
+            AND t.id  = #{id}
+        </if>
+        ORDER BY
+        t.update_time DESC
+    </select>
+
 </mapper>

--
Gitblit v1.9.3