From ed0dc655e6732f15d30f399c0d460ad7b9fe42da Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期三, 04 六月 2025 16:55:42 +0800
Subject: [PATCH] add:影视作品点赞和评论点赞

---
 src/main/java/com/mzl/flower/service/film/CommentLikesService.java          |    4 
 src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java               |  102 ++
 src/main/java/com/mzl/flower/mapper/film/LikeCommentPoMapper.java           |   97 ++
 src/main/java/com/mzl/flower/dto/request/film/CommentLikesDTO.java          |   97 --
 pom.xml                                                                     |   75 +
 src/main/java/com/mzl/flower/service/film/FilmLikesService.java             |    2 
 src/main/java/com/mzl/flower/service/film/impl/CommentLikesServiceImpl.java |   31 
 src/main/java/com/mzl/flower/service/film/impl/FilmLikesServiceImpl.java    |   28 
 src/main/java/com/mzl/flower/web/film/CommentController.java                |   56 +
 src/main/java/com/mzl/flower/mapper/film/CommentPoExMapper.java             |   41 
 src/main/java/com/mzl/flower/entity/film/CommentPo.java                     |   37 
 src/main/java/com/mzl/flower/service/film/CommentService.java               |  105 ++
 src/main/resources/mapper/film/CommentPoExMapper.xml                        |   54 +
 src/main/java/com/mzl/flower/dto/response/film/CommentDTO.java              |   99 ++
 src/main/java/com/mzl/flower/mapper/film/LikeCommentPoExMapper.java         |   22 
 src/main/java/com/mzl/flower/service/system/UserService.java                |    4 
 src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java            |   29 
 src/main/java/com/mzl/flower/service/film/impl/CommentServiceImpl.java      |  297 ++++++
 src/main/resources/mapper/film/CommentPoMapper.xml                          |  279 ++++++
 src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java               |    2 
 src/main/java/com/mzl/flower/entity/film/CommentPoExample.java              |  809 +++++++++++++++++
 src/main/java/com/mzl/flower/mapper/film/CommonMS.java                      |   52 +
 src/main/java/com/mzl/flower/utils/CommentTreeUtils.java                    |   53 +
 src/main/resources/mapper/film/LikeCommentPoExMapper.xml                    |   27 
 src/main/java/com/mzl/flower/enums/SortRuleEnum.java                        |   24 
 src/main/java/com/mzl/flower/entity/film/CommentLikes.java                  |    2 
 src/main/resources/mapper/system/UserMapper.xml                             |   11 
 src/main/resources/mapper/film/LikeCommentPoMapper.xml                      |  220 ++++
 src/main/java/com/mzl/flower/dto/request/film/FilmLikesDTO.java             |    2 
 src/main/java/com/mzl/flower/mapper/film/CommentMS.java                     |   15 
 src/main/java/com/mzl/flower/dto/request/film/CommentSearchDTO.java         |   51 +
 src/main/java/com/mzl/flower/web/film/CommentLikesController.java           |   10 
 32 files changed, 2,627 insertions(+), 110 deletions(-)

diff --git a/pom.xml b/pom.xml
index 2702f56..c38859f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,6 +22,10 @@
         <io.swagger.version>1.5.22</io.swagger.version>
         <base.version>1.0-SNAPSHOT</base.version>
         <mybatis-plus.version>3.4.1</mybatis-plus.version>
+        <pagehelper-spring-boot-starter.version>1.3.0</pagehelper-spring-boot-starter.version>
+        <mapstruct.version>1.4.2.Final</mapstruct.version>
+        <lombok.version>1.18.20</lombok.version>
+        <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
     </properties>
 
     <dependencies>
@@ -322,6 +326,50 @@
             <version>${tomcat.version}</version> <!-- 通常由Spring Boot管理 -->
         </dependency>
 
+        <!-- pagehelper分页-start -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>${pagehelper-spring-boot-starter.version}</version>
+<!--            <exclusions>-->
+<!--                <exclusion>-->
+<!--                    <groupId>org.mybatis.spring.boot</groupId>-->
+<!--                    <artifactId>mybatis-spring-boot-starter</artifactId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+            <version>${mapstruct.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct-processor</artifactId>
+            <version>${mapstruct.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok-mapstruct-binding</artifactId>
+            <version>${lombok-mapstruct-binding.version}</version>
+        </dependency>
+        <!-- pagehelper分页-end -->
+
+<!--        &lt;!&ndash;代码生成器依赖&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>org.freemarker</groupId>-->
+<!--            <artifactId>freemarker</artifactId>-->
+<!--            <version>${freemarker.version}</version>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
+
+<!--        <dependency>-->
+<!--            <groupId>com.baomidou</groupId>-->
+<!--            <artifactId>mybatis-plus-generator</artifactId>-->
+<!--            <version>${mybatis-plus.version}</version>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
 
     </dependencies>
 
@@ -333,6 +381,33 @@
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>UTF-8</encoding>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.mapstruct</groupId>
+                            <artifactId>mapstruct-processor</artifactId>
+                            <version>${mapstruct.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                            <version>${lombok.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok-mapstruct-binding</artifactId>
+                            <version>${lombok-mapstruct-binding.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-resources-plugin</artifactId>
                 <executions>
                     <execution>
diff --git a/src/main/java/com/mzl/flower/dto/request/film/CommentLikesDTO.java b/src/main/java/com/mzl/flower/dto/request/film/CommentLikesDTO.java
index 13627d3..f35ec6d 100644
--- a/src/main/java/com/mzl/flower/dto/request/film/CommentLikesDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/film/CommentLikesDTO.java
@@ -2,105 +2,16 @@
 
 import lombok.Data;
 
-import java.math.BigDecimal;
-import java.time.LocalDate;
 
 @Data
 public class CommentLikesDTO {
     /**
-     * 关联的影视作品ID
+     * 评论ID
      */
-    private Integer filmId;
+    private Integer commentId;
 
     /**
-     * 拍摄地点名称
+     * 点赞状态(0取消,1有效)
      */
-    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启用)
-     */
-    private Integer status;
-
-
-    /**
-     * 打卡记录量
-     */
-    private Integer checkinCount;
-
-    /**
-     * 游客实拍图(存储JSON数组)
-     */
-    private String visitorPhotos;
-
+    private Boolean status;
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/film/CommentSearchDTO.java b/src/main/java/com/mzl/flower/dto/request/film/CommentSearchDTO.java
new file mode 100644
index 0000000..0d0787b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/film/CommentSearchDTO.java
@@ -0,0 +1,51 @@
+package com.mzl.flower.dto.request.film;
+
+import com.mzl.flower.enums.SortRuleEnum;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author fanghaowei
+ * @date 2025/4/6 15:06
+ */
+@Data
+public class CommentSearchDTO implements Serializable {
+    /**
+     * 评论编号
+     */
+    private Integer id;
+
+    /**
+     * 评论内容
+     */
+    private String content;
+
+    /**
+     * 评论用户id
+     */
+    private String createBy;
+
+    /**
+     * 文章id
+     */
+    private Integer filmId;
+
+    /**
+     * 排序规则
+     */
+    private SortRuleEnum sortRule;
+
+    /**
+     * 当前页
+     */
+    private Integer currentPage;
+
+    /**
+     * 每页条数
+     */
+    private Integer pageSize;
+
+    private static final long serialVersionUID = 1L;
+
+}
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 682efc4..fde8c23 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
@@ -90,7 +90,7 @@
     /**
      * 状态(0禁用,1启用)
      */
-    private Integer status;
+    private Boolean status;
 
 
     /**
diff --git a/src/main/java/com/mzl/flower/dto/response/film/CommentDTO.java b/src/main/java/com/mzl/flower/dto/response/film/CommentDTO.java
new file mode 100644
index 0000000..1adc109
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/film/CommentDTO.java
@@ -0,0 +1,99 @@
+package com.mzl.flower.dto.response.film;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ * @date 2025/6/6 14:30
+ */
+@Data
+public class CommentDTO implements Serializable {
+    /**
+     * 评论编号
+     */
+    private Integer id;
+
+    /**
+     * 父评论id
+     */
+    private Integer parentId;
+
+    /**
+     * 评论内容
+     */
+    private String content;
+
+    /**
+     * 被评论帖子id
+     */
+    private Integer filmId;
+
+    /**
+     * 状态(0禁用,1启用)
+     */
+    private Boolean state;
+
+    /**
+     * 逻辑删除(0正常,1删除)
+     */
+    private Boolean deleted;
+
+    /**
+     * 评论用户id
+     */
+    private String createBy;
+
+    /**
+     * 评论用户名称
+     */
+    private String commentUserName;
+
+    /**
+     * 用户头像
+     */
+    private String picture;
+
+    /**
+     * 等级(Lv6)
+     */
+    private String level;
+
+    /**
+     * 是否点赞
+     */
+    private Boolean isLike;
+
+    /**
+     * 点赞数量
+     */
+    private Long likeCount;
+
+    /**
+     * 回复数量
+     */
+    private Integer repliesCount;
+
+    /**
+     * 评论深度
+     */
+    private Integer depth;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    private List<CommentDTO> child;
+
+    private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/film/CommentLikes.java b/src/main/java/com/mzl/flower/entity/film/CommentLikes.java
index 0ab4f97..f3482d1 100644
--- a/src/main/java/com/mzl/flower/entity/film/CommentLikes.java
+++ b/src/main/java/com/mzl/flower/entity/film/CommentLikes.java
@@ -5,7 +5,7 @@
 import lombok.Data;
 
 /**
- * 影视作品点赞表
+ * 评论点赞表
  *
  * @author generator@Fang
  * @since 2025-05-29
diff --git a/src/main/java/com/mzl/flower/entity/film/CommentPo.java b/src/main/java/com/mzl/flower/entity/film/CommentPo.java
new file mode 100644
index 0000000..9e9b8f2
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/film/CommentPo.java
@@ -0,0 +1,37 @@
+package com.mzl.flower.entity.film;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoPhyEntity;
+import lombok.Data;
+
+
+@Data
+@TableName("film_comments")
+public class CommentPo extends BaseAutoPhyEntity {
+
+    /**
+     * 父评论id
+     */
+    @TableField("parent_id")
+    private Integer parentId;
+
+    /**
+     * 被评论帖子id
+     */
+    @TableField("film_id")
+    private Integer filmId;
+
+    /**
+     * 评论内容
+     */
+    @TableField("content")
+    private String content;
+
+    /**
+     * 状态(0禁用,1启用)
+     */
+    @TableField("state")
+    private Boolean state;
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/film/CommentPoExample.java b/src/main/java/com/mzl/flower/entity/film/CommentPoExample.java
new file mode 100644
index 0000000..8e11af6
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/film/CommentPoExample.java
@@ -0,0 +1,809 @@
+package com.mzl.flower.entity.film;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CommentPoExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * CommentPoExample
+     *
+     * @return
+     */
+    public CommentPoExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * setOrderByClause
+     *
+     * @param orderByClause
+     * @return
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * getOrderByClause
+     *
+     * @return
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * setDistinct
+     *
+     * @param distinct
+     * @return
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * isDistinct
+     *
+     * @return
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * getOredCriteria
+     *
+     * @return
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * or
+     *
+     * @param criteria
+     * @return
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * or
+     *
+     * @return
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * createCriteria
+     *
+     * @return
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * createCriteriaInternal
+     *
+     * @return
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * clear
+     *
+     * @return
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Integer value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Integer value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Integer value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Integer value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Integer value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Integer> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Integer> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Integer value1, Integer value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdIsNull() {
+            addCriterion("parent_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdIsNotNull() {
+            addCriterion("parent_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdEqualTo(Integer value) {
+            addCriterion("parent_id =", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdNotEqualTo(Integer value) {
+            addCriterion("parent_id <>", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdGreaterThan(Integer value) {
+            addCriterion("parent_id >", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("parent_id >=", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdLessThan(Integer value) {
+            addCriterion("parent_id <", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdLessThanOrEqualTo(Integer value) {
+            addCriterion("parent_id <=", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdIn(List<Integer> values) {
+            addCriterion("parent_id in", values, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdNotIn(List<Integer> values) {
+            addCriterion("parent_id not in", values, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdBetween(Integer value1, Integer value2) {
+            addCriterion("parent_id between", value1, value2, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPreIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("parent_id not between", value1, value2, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIsNull() {
+            addCriterion("content is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIsNotNull() {
+            addCriterion("content is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentEqualTo(String value) {
+            addCriterion("content =", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotEqualTo(String value) {
+            addCriterion("content <>", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentGreaterThan(String value) {
+            addCriterion("content >", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentGreaterThanOrEqualTo(String value) {
+            addCriterion("content >=", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLessThan(String value) {
+            addCriterion("content <", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLessThanOrEqualTo(String value) {
+            addCriterion("content <=", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLike(String value) {
+            addCriterion("content like", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotLike(String value) {
+            addCriterion("content not like", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIn(List<String> values) {
+            addCriterion("content in", values, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotIn(List<String> values) {
+            addCriterion("content not in", values, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentBetween(String value1, String value2) {
+            addCriterion("content between", value1, value2, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotBetween(String value1, String value2) {
+            addCriterion("content not between", value1, value2, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdIsNull() {
+            addCriterion("film_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdIsNotNull() {
+            addCriterion("film_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdEqualTo(Integer value) {
+            addCriterion("film_id =", value, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdNotEqualTo(Integer value) {
+            addCriterion("film_id <>", value, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdGreaterThan(Integer value) {
+            addCriterion("film_id >", value, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("film_id >=", value, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdLessThan(Integer value) {
+            addCriterion("film_id <", value, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdLessThanOrEqualTo(Integer value) {
+            addCriterion("film_id <=", value, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdIn(List<Integer> values) {
+            addCriterion("film_id in", values, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdNotIn(List<Integer> values) {
+            addCriterion("film_id not in", values, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdBetween(Integer value1, Integer value2) {
+            addCriterion("film_id between", value1, value2, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andArticleIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("film_id not between", value1, value2, "filmId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateIsNull() {
+            addCriterion("`state` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateIsNotNull() {
+            addCriterion("`state` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateEqualTo(Boolean value) {
+            addCriterion("`state` =", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateNotEqualTo(Boolean value) {
+            addCriterion("`state` <>", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateGreaterThan(Boolean value) {
+            addCriterion("`state` >", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("`state` >=", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateLessThan(Boolean value) {
+            addCriterion("`state` <", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateLessThanOrEqualTo(Boolean value) {
+            addCriterion("`state` <=", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateIn(List<Boolean> values) {
+            addCriterion("`state` in", values, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateNotIn(List<Boolean> values) {
+            addCriterion("`state` not in", values, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateBetween(Boolean value1, Boolean value2) {
+            addCriterion("`state` between", value1, value2, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("`state` not between", value1, value2, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedIsNull() {
+            addCriterion("deleted is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedIsNotNull() {
+            addCriterion("deleted is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedEqualTo(Boolean value) {
+            addCriterion("deleted =", value, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedNotEqualTo(Boolean value) {
+            addCriterion("deleted <>", value, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedGreaterThan(Boolean value) {
+            addCriterion("deleted >", value, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("deleted >=", value, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedLessThan(Boolean value) {
+            addCriterion("deleted <", value, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedLessThanOrEqualTo(Boolean value) {
+            addCriterion("deleted <=", value, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedIn(List<Boolean> values) {
+            addCriterion("deleted in", values, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedNotIn(List<Boolean> values) {
+            addCriterion("deleted not in", values, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedBetween(Boolean value1, Boolean value2) {
+            addCriterion("deleted between", value1, value2, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeletedNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("deleted not between", value1, value2, "deleted");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserIsNull() {
+            addCriterion("comment_user is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserIsNotNull() {
+            addCriterion("comment_user is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserEqualTo(Long value) {
+            addCriterion("comment_user =", value, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserNotEqualTo(Long value) {
+            addCriterion("comment_user <>", value, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserGreaterThan(Long value) {
+            addCriterion("comment_user >", value, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserGreaterThanOrEqualTo(Long value) {
+            addCriterion("comment_user >=", value, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserLessThan(Long value) {
+            addCriterion("comment_user <", value, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserLessThanOrEqualTo(Long value) {
+            addCriterion("comment_user <=", value, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserIn(List<Long> values) {
+            addCriterion("comment_user in", values, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserNotIn(List<Long> values) {
+            addCriterion("comment_user not in", values, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserBetween(Long value1, Long value2) {
+            addCriterion("comment_user between", value1, value2, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommentUserNotBetween(Long value1, Long value2) {
+            addCriterion("comment_user not between", value1, value2, "commentUser");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(LocalDateTime value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(LocalDateTime value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(LocalDateTime value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(LocalDateTime value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(LocalDateTime value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(LocalDateTime value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<LocalDateTime> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<LocalDateTime> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(LocalDateTime value1, LocalDateTime value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(LocalDateTime value1, LocalDateTime value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(LocalDateTime value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(LocalDateTime value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(LocalDateTime value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(LocalDateTime value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(LocalDateTime value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(LocalDateTime value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<LocalDateTime> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<LocalDateTime> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(LocalDateTime value1, LocalDateTime value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(LocalDateTime value1, LocalDateTime value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/enums/SortRuleEnum.java b/src/main/java/com/mzl/flower/enums/SortRuleEnum.java
new file mode 100644
index 0000000..b1878f3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/SortRuleEnum.java
@@ -0,0 +1,24 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+/**
+ * 影视作品排序
+ */
+@Getter
+public enum SortRuleEnum {
+    /**
+     * 最热,最新
+     */
+    hottest("最热"), newest("最新");
+
+    /**
+     * 说明
+     */
+    private String desc;
+
+    SortRuleEnum(String name) {
+        this.desc = name;
+    }
+
+}
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 e17611d..e70d5b6 100644
--- a/src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java
@@ -2,15 +2,32 @@
 
 import com.mzl.flower.entity.film.CommentLikes;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
 
 /**
- * <p>
- * 影视作品点赞表 Mapper 接口
- * </p>
- *
- * @author generator@Fang
- * @since 2025-05-29
+ * 评论点赞表 Mapper
  */
+@Repository
 public interface CommentLikesMapper extends BaseMapper<CommentLikes> {
 
+    /**
+     * 根据评论id查询点赞数量
+     */
+    @Select("select count(1) from comment_likes where  status = '1' and comment_id =#{ id}  ")
+    Long getLikeCountCommentId(Integer id);
+
+    /**
+     * 判断用户是否点赞
+     */
+    @Select("select status from comment_likes where comment_id = #{commentId} and create_by = #{userId} ")
+    Boolean isLike(Integer commentId, String userId);
+
+    /**
+     * 查询人员有没有对应的评论点赞信息
+     */
+
+    @Select("select * from comment_likes where create_by = #{userId} and comment_id = #{commentId} ")
+    CommentLikes getCommentLikeByUserIdAndCommentId(String userId, Integer commentId);
+
 }
diff --git a/src/main/java/com/mzl/flower/mapper/film/CommentMS.java b/src/main/java/com/mzl/flower/mapper/film/CommentMS.java
new file mode 100644
index 0000000..5a83793
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/CommentMS.java
@@ -0,0 +1,15 @@
+package com.mzl.flower.mapper.film;
+
+import com.mzl.flower.dto.response.film.CommentDTO;
+import com.mzl.flower.entity.film.CommentPo;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * @author fanghaowei
+ * @date
+ */
+@Mapper(componentModel = "spring")
+public interface CommentMS extends CommonMS<CommentPo, CommentDTO> {
+    CommentMS INSTANCE = Mappers.getMapper(CommentMS.class);
+}
diff --git a/src/main/java/com/mzl/flower/mapper/film/CommentPoExMapper.java b/src/main/java/com/mzl/flower/mapper/film/CommentPoExMapper.java
new file mode 100644
index 0000000..3b97b5f
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/CommentPoExMapper.java
@@ -0,0 +1,41 @@
+package com.mzl.flower.mapper.film;
+
+import com.mzl.flower.entity.film.CommentPo;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ */
+public interface CommentPoExMapper {
+
+    /**
+     * 获取最新评论信息
+     *
+     * @param content
+     * @param commentUser
+     * @return
+     */
+    List<CommentPo> selectLatestComments(String content, String commentUser);
+
+    /**
+     * 获取所有通过审核文章的评论信息
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<CommentPo> getAllArticleComment(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
+
+    /**
+     * 获取所有通过审核文章的评论回复信息
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<CommentPo> getAllCommentReply(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java b/src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java
new file mode 100644
index 0000000..7ea15f3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java
@@ -0,0 +1,102 @@
+package com.mzl.flower.mapper.film;
+
+import com.mzl.flower.entity.film.CommentPo;
+import com.mzl.flower.entity.film.CommentPoExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+public interface CommentPoMapper {
+    /**
+     * countByExample
+     *
+     * @param example
+     * @return
+     */
+    long countByExample(CommentPoExample example);
+
+    /**
+     * deleteByExample
+     *
+     * @param example
+     * @return
+     */
+    int deleteByExample(CommentPoExample example);
+
+    /**
+     * deleteByPrimaryKey
+     *
+     * @param id
+     * @return
+     */
+    int deleteByPrimaryKey(Integer id);
+
+    /**
+     * insert
+     *
+     * @param record
+     * @return
+     */
+    int insert(CommentPo record);
+
+    /**
+     * insertSelective
+     *
+     * @param record
+     * @return
+     */
+    int insertSelective(CommentPo record);
+
+    /**
+     * selectByExample
+     *
+     * @param example
+     * @return
+     */
+    List<CommentPo> selectByExample(CommentPoExample example);
+
+    /**
+     * selectByPrimaryKey
+     *
+     * @param id
+     * @return
+     */
+    CommentPo selectByPrimaryKey(Integer id);
+
+    /**
+     * updateByExampleSelective
+     *
+     * @param record
+     * @param example
+     * @return
+     */
+    int updateByExampleSelective(@Param("record") CommentPo record, @Param("example") CommentPoExample example);
+
+    /**
+     * updateByExample
+     *
+     * @param record
+     * @param example
+     * @return
+     */
+    int updateByExample(@Param("record") CommentPo record, @Param("example") CommentPoExample example);
+
+    /**
+     * updateByPrimaryKeySelective
+     *
+     * @param record
+     * @return
+     */
+    int updateByPrimaryKeySelective(CommentPo record);
+
+    /**
+     * updateByPrimaryKey
+     *
+     * @param record
+     * @return
+     */
+    int updateByPrimaryKey(CommentPo record);
+
+    List<CommentPo> selectByArticleId(Integer articleId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/mapper/film/CommonMS.java b/src/main/java/com/mzl/flower/mapper/film/CommonMS.java
new file mode 100644
index 0000000..aa1cbea
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/CommonMS.java
@@ -0,0 +1,52 @@
+package com.mzl.flower.mapper.film;
+
+import com.github.pagehelper.PageInfo;
+
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ * @date
+ */
+public interface CommonMS<P, D> {
+    /**
+     * po转dto
+     *
+     * @param p po
+     * @return dto
+     */
+    D toDTO(P p);
+
+    /**
+     * dto转po
+     *
+     * @param d dto
+     * @return po
+     */
+    P toPo(D d);
+
+    /**
+     * po转dto
+     *
+     * @param pList po
+     * @return dto
+     */
+    List<D> toDTO(List<P> pList);
+
+    /**
+     * dto转po
+     *
+     * @param pList dto
+     * @return po
+     */
+    List<P> toPo(List<D> pList);
+
+    /**
+     * po转dto
+     *
+     * @param pageInfo po
+     * @return dto
+     */
+    PageInfo<D> toPage(PageInfo<P> pageInfo);
+
+}
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 90b4d6b..81f01a2 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,7 @@
 
 import com.mzl.flower.entity.film.FilmLikes;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
 
 /**
  * <p>
@@ -11,6 +12,7 @@
  * @author generator@Fang
  * @since 2025-05-29
  */
+@Repository
 public interface FilmLikesMapper extends BaseMapper<FilmLikes> {
 
 }
diff --git a/src/main/java/com/mzl/flower/mapper/film/LikeCommentPoExMapper.java b/src/main/java/com/mzl/flower/mapper/film/LikeCommentPoExMapper.java
new file mode 100644
index 0000000..0099734
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/LikeCommentPoExMapper.java
@@ -0,0 +1,22 @@
+package com.mzl.flower.mapper.film;
+
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ */
+public interface LikeCommentPoExMapper {
+
+    /**
+     * 获取所有通过审核文章的评论的点赞信息
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+//    List<LikeCommentPo> selectAllCommentLike(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/film/LikeCommentPoMapper.java b/src/main/java/com/mzl/flower/mapper/film/LikeCommentPoMapper.java
new file mode 100644
index 0000000..3ca30f2
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/LikeCommentPoMapper.java
@@ -0,0 +1,97 @@
+package com.mzl.flower.mapper.film;
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface LikeCommentPoMapper {
+//    /**
+//     * countByExample
+//     *
+//     * @param example
+//     * @return
+//     */
+//    long countByExample(LikeCommentPoExample example);
+//
+//    /**
+//     * deleteByExample
+//     *
+//     * @param example
+//     * @return
+//     */
+//    int deleteByExample(LikeCommentPoExample example);
+//
+//    /**
+//     * deleteByPrimaryKey
+//     *
+//     * @param id
+//     * @return
+//     */
+//    int deleteByPrimaryKey(Integer id);
+//
+//    /**
+//     * insert
+//     *
+//     * @param record
+//     * @return
+//     */
+//    int insert(LikeCommentPo record);
+//
+//    /**
+//     * insertSelective
+//     *
+//     * @param record
+//     * @return
+//     */
+//    int insertSelective(LikeCommentPo record);
+//
+//    /**
+//     * selectByExample
+//     *
+//     * @param example
+//     * @return
+//     */
+//    List<LikeCommentPo> selectByExample(LikeCommentPoExample example);
+//
+//    /**
+//     * selectByPrimaryKey
+//     *
+//     * @param id
+//     * @return
+//     */
+//    LikeCommentPo selectByPrimaryKey(Integer id);
+//
+//    /**
+//     * updateByExampleSelective
+//     *
+//     * @param record
+//     * @param example
+//     * @return
+//     */
+//    int updateByExampleSelective(@Param("record") LikeCommentPo record, @Param("example") LikeCommentPoExample example);
+//
+//    /**
+//     * updateByExample
+//     *
+//     * @param record
+//     * @param example
+//     * @return
+//     */
+//    int updateByExample(@Param("record") LikeCommentPo record, @Param("example") LikeCommentPoExample example);
+//
+//    /**
+//     * updateByPrimaryKeySelective
+//     *
+//     * @param record
+//     * @return
+//     */
+//    int updateByPrimaryKeySelective(LikeCommentPo record);
+//
+//    /**
+//     * updateByPrimaryKey
+//     *
+//     * @param record
+//     * @return
+//     */
+//    int updateByPrimaryKey(LikeCommentPo record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/service/film/CommentLikesService.java b/src/main/java/com/mzl/flower/service/film/CommentLikesService.java
index 82142dc..3afd3d4 100644
--- a/src/main/java/com/mzl/flower/service/film/CommentLikesService.java
+++ b/src/main/java/com/mzl/flower/service/film/CommentLikesService.java
@@ -21,4 +21,8 @@
     void deleteCommentLikes(String id);
 
     Page<CommentLikesVO> queryPage(CommentLikesQueryDTO commentLikesQueryDTO, Page page);
+
+    Long getLikeCountCommentId(Integer id);
+
+    Boolean isLike(Integer commentId, String userId);
 }
diff --git a/src/main/java/com/mzl/flower/service/film/CommentService.java b/src/main/java/com/mzl/flower/service/film/CommentService.java
new file mode 100644
index 0000000..e08c6e1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/CommentService.java
@@ -0,0 +1,105 @@
+package com.mzl.flower.service.film;
+
+
+import com.github.pagehelper.PageInfo;
+import com.mzl.flower.dto.request.film.CommentSearchDTO;
+import com.mzl.flower.dto.response.film.CommentDTO;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ * @date 2025/4/6 14:33
+ */
+public interface CommentService {
+    /**
+     * 获取文章的评论信息
+     *
+     * @param commentSearchDTO
+     * @return
+     */
+    List<CommentDTO> getCommentByFilmId(CommentSearchDTO commentSearchDTO);
+
+    /**
+     * 获取所有通过审核文章的评论信息
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<CommentDTO> getAllArticleComment(LocalDateTime startTime, LocalDateTime endTime);
+
+    /**
+     * 获取所有通过审核文章的评论回复信息
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<CommentDTO> getAllCommentReply(LocalDateTime startTime, LocalDateTime endTime);
+
+    /**
+     * 获取最新评论信息
+     *
+     * @param commentSearchDTO
+     * @return
+     */
+    PageInfo<CommentDTO> getLatestComment(CommentSearchDTO commentSearchDTO);
+
+    /**
+     * 获取文章的评论数量
+     *
+     * @param articleId
+     * @return
+     */
+    Long getCommentCountByArticle(Integer articleId);
+
+    /**
+     * 获取评论数量
+     *
+     * @return
+     */
+    Long getTotal();
+
+    /**
+     * 创建评论
+     *
+     * @param commentDTO
+     * @return
+     */
+    Boolean create(CommentDTO commentDTO);
+
+    /**
+     * 删除评论
+     *
+     * @param commentId
+     * @return
+     */
+    Boolean delete(Integer commentId);
+
+    /**
+     * 通过父级ID获取子级评论信息
+     *
+     * @param result 存放结果
+     * @param preId
+     * @return
+     */
+    void getAllChildrenByPreId(List<CommentDTO> result, Integer preId);
+
+    /**
+     * 获取评论id获取文章id
+     *
+     * @param commentId
+     * @return
+     */
+    String getArticleIdByCommentId(Integer commentId);
+
+    /**
+     * 通过批量id获取评论信息
+     *
+     * @param commentId
+     * @return
+     */
+    CommentDTO getById(Integer commentId);
+}
diff --git a/src/main/java/com/mzl/flower/service/film/FilmLikesService.java b/src/main/java/com/mzl/flower/service/film/FilmLikesService.java
index 4a9c77b..d378381 100644
--- a/src/main/java/com/mzl/flower/service/film/FilmLikesService.java
+++ b/src/main/java/com/mzl/flower/service/film/FilmLikesService.java
@@ -20,7 +20,7 @@
 
     void saveFilmLikes(FilmLikesDTO filmLikesDTO);
 
-    void updateFilmLikes(FilmLikesDTO filmLikesDTO);
+    Boolean updateFilmLikes(FilmLikesDTO filmLikesDTO);
     void deleteFilmLikes(String id);
 
     Page<FilmLikesVO> queryPage(FilmLikesQueryDTO filmLikesQueryDTO, Page page);
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 441c9a9..d9d8bd7 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.security.SecurityUtils;
 import com.mzl.flower.dto.request.film.CommentLikesDTO;
 import com.mzl.flower.dto.request.film.CommentLikesQueryDTO;
 import com.mzl.flower.dto.response.film.CommentLikesVO;
@@ -10,12 +11,17 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+
 /**
  * @author generator@Fang
  * @since 2025-05-29
  */
 @Service
 public class CommentLikesServiceImpl extends ServiceImpl<CommentLikesMapper, CommentLikes> implements CommentLikesService {
+
+    @Resource
+    private CommentLikesMapper commentLikesMapper;
 
     @Override
     public void saveCommentLikes(CommentLikesDTO commentLikesDTO) {
@@ -24,7 +30,20 @@
 
     @Override
     public void updateCommentLikes(CommentLikesDTO commentLikesDTO) {
-
+        //查询有没有对应人员的点赞信息
+        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);
+        } else {
+            // 状态取反
+            commentLikes.setStatus(!commentLikes.getStatus());
+            commentLikes.update(SecurityUtils.getUserId());
+            commentLikesMapper.updateById(commentLikes);
+        }
     }
 
     @Override
@@ -36,4 +55,14 @@
     public Page<CommentLikesVO> queryPage(CommentLikesQueryDTO commentLikesQueryDTO, Page page) {
         return null;
     }
+
+    @Override
+    public Long getLikeCountCommentId(Integer id) {
+        return commentLikesMapper.getLikeCountCommentId(id);
+    }
+
+    @Override
+    public Boolean isLike(Integer commentId, String userId) {
+        return commentLikesMapper.isLike(commentId,userId);
+    }
 }
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
new file mode 100644
index 0000000..e854bb9
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/impl/CommentServiceImpl.java
@@ -0,0 +1,297 @@
+package com.mzl.flower.service.film.impl;
+import com.github.pagehelper.PageInfo;
+import com.github.pagehelper.PageHelper;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.film.CommentSearchDTO;
+import com.mzl.flower.dto.response.current.CurrentUserDTO;
+import com.mzl.flower.dto.response.customer.CustomerDTO;
+import com.mzl.flower.dto.response.film.CommentDTO;
+import com.mzl.flower.dto.security.UserDTO;
+import com.mzl.flower.entity.film.CommentPo;
+import com.mzl.flower.entity.film.CommentPoExample;
+import com.mzl.flower.entity.system.User;
+import com.mzl.flower.enums.SortRuleEnum;
+import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.mapper.film.CommentMS;
+import com.mzl.flower.mapper.film.CommentPoExMapper;
+import com.mzl.flower.mapper.film.CommentPoMapper;
+import com.mzl.flower.service.film.CommentLikesService;
+import com.mzl.flower.service.film.CommentService;
+import com.mzl.flower.service.system.UserService;
+import com.mzl.flower.utils.CommentTreeUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@Service
+public class CommentServiceImpl implements CommentService {
+    @Resource
+    private CommentPoMapper commentPoMapper;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private CommentPoExMapper commentPoExMapper;
+
+    @Resource
+    private CustomerMapper customerMapper;
+
+    @Resource
+    private CommentService commentService;
+    @Resource
+    private CommentLikesService commentLikesService;
+
+    /**
+     * 获取文章的评论信息
+     *
+     * @param commentSearchDTO
+     * @return
+     */
+
+    @Override
+    public List<CommentDTO> getCommentByFilmId(CommentSearchDTO commentSearchDTO) {
+
+        CurrentUserDTO currentUser = userService.getCurrentUser();
+        // 直接调用 mapper 方法获取评论列表
+        List<CommentPo> commentPos = commentPoMapper.selectByArticleId(commentSearchDTO.getFilmId());
+
+        List<CommentDTO> commentDTOS = CommentMS.INSTANCE.toDTO(commentPos);
+
+        if (CollectionUtils.isNotEmpty(commentDTOS)) {
+            //构建评论信息
+            buildCommentInfo(commentDTOS, currentUser);
+        }
+
+        commentDTOS = CommentTreeUtils.toTree(commentDTOS);
+
+        // 排序逻辑保持不变
+        if (SortRuleEnum.hottest.equals(commentSearchDTO.getSortRule())) {
+            commentDTOS = commentDTOS.stream()
+                    .sorted(Comparator.comparing(CommentDTO::getLikeCount, Comparator.nullsLast(Comparator.reverseOrder()))
+                            .thenComparing(CommentDTO::getRepliesCount, Comparator.nullsLast(Comparator.reverseOrder())))
+                    .collect(Collectors.toList());
+        } else if (SortRuleEnum.newest.equals(commentSearchDTO.getSortRule())) {
+            commentDTOS = commentDTOS.stream()
+                    .sorted(Comparator.comparing(CommentDTO::getCreateTime, Comparator.nullsLast(Comparator.reverseOrder())))
+                    .collect(Collectors.toList());
+        }
+
+        return commentDTOS;
+    }
+
+    /**
+     * 获取所有通过审核文章的评论信息
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @Override
+    public List<CommentDTO> getAllArticleComment(LocalDateTime startTime, LocalDateTime endTime) {
+        return CommentMS.INSTANCE.toDTO(commentPoExMapper.getAllArticleComment(startTime, endTime));
+    }
+
+    @Override
+    public List<CommentDTO> getAllCommentReply(LocalDateTime startTime, LocalDateTime endTime) {
+        return CommentMS.INSTANCE.toDTO(commentPoExMapper.getAllCommentReply(startTime, endTime));
+    }
+
+    /**
+     * 获取最新评论信息
+     *
+     * @param commentSearchDTO
+     * @return
+     */
+    @Override
+    public PageInfo<CommentDTO> getLatestComment(CommentSearchDTO commentSearchDTO) {
+        PageHelper.startPage(commentSearchDTO.getCurrentPage(), commentSearchDTO.getPageSize());
+        List<CommentPo> commentPos = commentPoExMapper.selectLatestComments(commentSearchDTO.getContent(), commentSearchDTO.getCreateBy());
+        PageInfo<CommentDTO> pageInfo = CommentMS.INSTANCE.toPage(new PageInfo<>(commentPos));
+        if (CollectionUtils.isNotEmpty(pageInfo.getList())) {
+            // 构建评论信息
+            buildCommentInfo(pageInfo.getList(), null);
+        }
+        return pageInfo;
+    }
+
+    /**
+     * 获取文章的评论数量
+     *
+     * @param articleId
+     * @return
+     */
+    @Override
+    public Long getCommentCountByArticle(Integer articleId) {
+        CommentPoExample example = new CommentPoExample();
+        example.createCriteria().andIsDeletedEqualTo(false)
+                .andStateEqualTo(true)
+                .andArticleIdEqualTo(articleId);
+
+        return commentPoMapper.countByExample(example);
+    }
+
+    /**
+     * 获取评论数量
+     *
+     * @return
+     */
+    @Override
+    public Long getTotal() {
+        CommentPoExample example = new CommentPoExample();
+        example.createCriteria().andIsDeletedEqualTo(false)
+                .andStateEqualTo(true);
+        return commentPoMapper.countByExample(example);
+    }
+
+    /**
+     * 创建评论
+     *
+     * @param commentDTO
+     * @return
+     */
+    @Override
+    public Boolean create(CommentDTO commentDTO) {
+        if (StringUtils.isEmpty(commentDTO.getContent())) {
+            throw new ValidationException("评论内容不能为空");
+        }
+        //todo 评论内风险校验,评论内容可以是图片资源,考虑增加一个contextType字段用来区分资源类型
+        CommentPo commentPo = new CommentPo();
+        BeanUtils.copyProperties(commentDTO, commentPo);
+        commentPo.setState(true);
+        commentPo.create(SecurityUtils.getUserId());
+        if (commentPoMapper.insert(commentPo) <= 0) {
+            throw new ValidationException("添加评论失败");
+        }
+        return true;
+    }
+
+    /**
+     * 删除评论
+     *
+     * @param commentId
+     * @return
+     */
+    @Override
+    public Boolean delete(Integer commentId) {
+        List<Integer> commentIds = new ArrayList<>();
+        List<CommentDTO> children = new ArrayList<>();
+        // 通过父级ID获取子级评论信息
+        this.getAllChildrenByPreId(children, commentId);
+        if (CollectionUtils.isNotEmpty(children)) {
+            commentIds.addAll(children.stream().map(CommentDTO::getId).collect(Collectors.toList()));
+        }
+        commentIds.add(commentId);
+        CommentPoExample example = new CommentPoExample();
+        example.createCriteria().andIdIn(commentIds);
+
+        CommentPo commentPo = new CommentPo();
+        commentPo.setDeleted(true);
+        commentPo.setUpdateTime(LocalDateTime.now());
+        if (commentPoMapper.updateByExampleSelective(commentPo, example) <= 0) {
+            throw new ValidationException("删除评论失败");
+        }
+        return true;
+    }
+
+    /**
+     * 通过父级ID获取子级评论信息
+     *
+     * @param result 存放结果
+     * @param preId
+     * @return
+     */
+    @Override
+    public void getAllChildrenByPreId(List<CommentDTO> result, Integer preId) {
+        CommentPoExample example = new CommentPoExample();
+        example.createCriteria().andIsDeletedEqualTo(false)
+                .andStateEqualTo(true)
+                .andPreIdEqualTo(preId);
+        List<CommentDTO> commentDTOS = CommentMS.INSTANCE.toDTO(commentPoMapper.selectByExample(example));
+        if (CollectionUtils.isNotEmpty(commentDTOS)) {
+            result.addAll(commentDTOS);
+            commentDTOS.forEach(commentDTO -> {
+                this.getAllChildrenByPreId(result, commentDTO.getId());
+            });
+        }
+    }
+
+    @Override
+    public String getArticleIdByCommentId(Integer commentId) {
+        CommentPo commentPo = commentPoMapper.selectByPrimaryKey(commentId);
+        return commentPo == null ? null : commentPo.getCreateBy();
+    }
+
+    @Override
+    public CommentDTO getById(Integer commentId) {
+        return CommentMS.INSTANCE.toDTO(commentPoMapper.selectByPrimaryKey(commentId));
+    }
+
+    /**
+     * 构建评论信息
+     *
+     * @param commentDTOS
+     * @param currentUser
+     */
+
+    private void buildCommentInfo(List<CommentDTO> commentDTOS, CurrentUserDTO currentUser) {
+        if (CollectionUtils.isEmpty(commentDTOS)) {
+            return;
+        }
+
+        List<String> userIds = commentDTOS.stream()
+                .map(CommentDTO::getCreateBy)
+                .distinct()
+                .collect(Collectors.toList());
+
+        Map<String, List<User>> idUsers = userService.getByIds(userIds).stream()
+                .collect(Collectors.groupingBy(User::getId));
+
+        Map<Integer, List<CommentDTO>> preIdMap = commentDTOS.stream()
+                .collect(Collectors.groupingBy(CommentDTO::getParentId));
+
+        commentDTOS.forEach(commentDTO -> {
+            // 设置用户名和头像
+            User userInfo = idUsers.getOrDefault(commentDTO.getCreateBy(), Collections.emptyList()).stream()
+                    .findFirst()
+                    .orElse(null);
+            if (userInfo != null) {
+                //获取用户信息
+                CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(commentDTO.getCreateBy());
+                if(!ObjectUtils.isEmpty(currentCustomer)){
+                    commentDTO.setCommentUserName(currentCustomer.getNickName());
+                    commentDTO.setPicture(currentCustomer.getCover());
+                    User user = userService.findByTel(currentCustomer.getTel(), Constants.USER_TYPE.customer.name());
+                    if(!ObjectUtils.isEmpty(user)){
+                        commentDTO.setLevel(user.getVipGrade());
+                    }
+                }
+            }
+
+            // 获取点赞数
+            commentDTO.setLikeCount(commentLikesService.getLikeCountCommentId(commentDTO.getId()));
+
+            // 是否已点赞,这里面传入的是用户ID
+            if (currentUser != null) {
+                commentDTO.setIsLike(commentLikesService.isLike(commentDTO.getId(), currentUser.getId()));
+            }
+
+            // 回复数量
+            commentDTO.setRepliesCount(preIdMap.getOrDefault(commentDTO.getId(), Collections.emptyList()).size());
+        });
+    }
+
+}
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 dce8bda..83d5bfd 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
@@ -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.dto.request.film.FilmLikesDTO;
 import com.mzl.flower.dto.request.film.FilmLikesQueryDTO;
 import com.mzl.flower.dto.response.film.FilmLikesVO;
@@ -9,6 +10,9 @@
 import com.mzl.flower.service.film.FilmLikesService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -21,14 +25,34 @@
 @Service
 public class FilmLikesServiceImpl extends ServiceImpl<FilmLikesMapper, FilmLikes> implements FilmLikesService {
 
+    @Resource
+     private FilmLikesMapper filmLikesMapper;
+
     @Override
     public void saveFilmLikes(FilmLikesDTO filmLikesDTO) {
 
     }
 
     @Override
-    public void updateFilmLikes(FilmLikesDTO filmLikesDTO) {
-
+    public Boolean updateFilmLikes(FilmLikesDTO filmLikesDTO) {
+        LocalDateTime now = LocalDateTime.now();
+        // 没有,新增
+        FilmLikes filmLikes = null;
+        if (filmLikesDTO == null) {
+            filmLikes = new FilmLikes();
+            filmLikes.setFilmId(filmLikesDTO.getFilmId());
+            filmLikes.setStatus(true);
+            if (filmLikesMapper.insert(filmLikes) <= 0) {
+                throw new ValidationException("添加评论点赞失败");
+            }
+        } else {
+            // 状态取反
+            filmLikesDTO.setStatus(!filmLikesDTO.getStatus());
+            if (filmLikesMapper.updateById(filmLikes) <= 0) {
+                throw new ValidationException("更新评论点赞状态失败");
+            }
+        }
+        return true;
     }
 
     @Override
diff --git a/src/main/java/com/mzl/flower/service/system/UserService.java b/src/main/java/com/mzl/flower/service/system/UserService.java
index 1a3835e..1d07e74 100644
--- a/src/main/java/com/mzl/flower/service/system/UserService.java
+++ b/src/main/java/com/mzl/flower/service/system/UserService.java
@@ -15,6 +15,7 @@
 import com.mzl.flower.dto.response.current.CurrentUserDTO;
 import com.mzl.flower.dto.response.customer.CustomerDTO;
 import com.mzl.flower.dto.response.system.*;
+import com.mzl.flower.dto.security.UserDTO;
 import com.mzl.flower.entity.customer.Customer;
 import com.mzl.flower.entity.point.CustomerPoint;
 import com.mzl.flower.entity.system.*;
@@ -696,4 +697,7 @@
     }
 
 
+    public List<User> getByIds(List<String> userIds) {
+        return userMapper.getByIds(userIds);
+    }
 }
diff --git a/src/main/java/com/mzl/flower/utils/CommentTreeUtils.java b/src/main/java/com/mzl/flower/utils/CommentTreeUtils.java
new file mode 100644
index 0000000..b11a381
--- /dev/null
+++ b/src/main/java/com/mzl/flower/utils/CommentTreeUtils.java
@@ -0,0 +1,53 @@
+package com.mzl.flower.utils;
+
+import com.mzl.flower.dto.response.film.CommentDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 用于树转集合,集合转树场景
+ *
+ * @author fanghaowei
+ * @date
+ */
+@Slf4j
+public class CommentTreeUtils {
+    /**
+     * 集合转树
+     *
+     * @param commentDTOS
+     * @return
+     */
+    public static List<CommentDTO> toTree(List<CommentDTO> commentDTOS) {
+        Map<Integer, CommentDTO> commentDTOMap = commentDTOS.stream().collect(Collectors.toMap(CommentDTO::getId, e -> e));
+        List<CommentDTO> root = new ArrayList<>();
+        for (CommentDTO dto : commentDTOS) {
+            Integer parentId = dto.getParentId();
+            // 是根评论
+            if (parentId == 0) {
+                // 设置评论深度
+                dto.setDepth(0);
+                root.add(dto);
+            } else {
+                CommentDTO parent = commentDTOMap.get(parentId);
+                // 跳过子级无父级的评论
+                if (parent == null) {
+                    continue;
+                }
+                List<CommentDTO> children = CollectionUtils.isEmpty(parent.getChild()) ? new ArrayList<>() : parent.getChild();
+                // 设置评论深度
+                dto.setDepth(parent.getDepth() + 1);
+                children.add(dto);
+                parent.setChild(children);
+            }
+        }
+        return root;
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/web/film/CommentController.java b/src/main/java/com/mzl/flower/web/film/CommentController.java
new file mode 100644
index 0000000..047a51c
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/film/CommentController.java
@@ -0,0 +1,56 @@
+package com.mzl.flower.web.film;
+
+import com.github.pagehelper.PageInfo;
+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.CommentSearchDTO;
+import com.mzl.flower.dto.response.film.CommentDTO;
+import com.mzl.flower.service.film.CommentService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+/**
+ * @author fanghaowei
+ * @date 2025/6/3 14:28
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/comment/")
+@Api(tags = "评论管理")
+public class CommentController extends BaseController {
+    @Resource
+    private CommentService commentService;
+
+    @GetMapping("getCommentByFilmId")
+    @ApiOperation(value = "获取文章的评论信息")
+    public ResponseEntity<ReturnDataDTO<List<CommentDTO>>> getCommentByFilmId(CommentSearchDTO commentSearchDTO) {
+        return returnData(R.SUCCESS.getCode(), commentService.getCommentByFilmId(commentSearchDTO));
+    }
+
+    @GetMapping("getLatestComment")
+    @ApiOperation(value = "获取最新评论信息")
+    public ResponseEntity<PageInfo<CommentDTO>> getLatestComment(CommentSearchDTO commentSearchDTO) {
+        return returnData(R.SUCCESS.getCode(),commentService.getLatestComment(commentSearchDTO));
+    }
+
+    @PostMapping("create")
+    @ApiOperation(value = "创建评论")
+    public ResponseEntity<Boolean> create(@RequestBody CommentDTO commentDTO) {
+        return returnData(R.SUCCESS.getCode(),commentService.create(commentDTO));
+    }
+
+    @PostMapping("delete/{commentId}")
+    @ApiOperation(value = "删除评论")
+    public ResponseEntity<Boolean> delete(@PathVariable Integer commentId) {
+        return returnData(R.SUCCESS.getCode(),commentService.delete(commentId));
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/web/film/CommentLikesController.java b/src/main/java/com/mzl/flower/web/film/CommentLikesController.java
index aebe64f..0b4a663 100644
--- a/src/main/java/com/mzl/flower/web/film/CommentLikesController.java
+++ b/src/main/java/com/mzl/flower/web/film/CommentLikesController.java
@@ -17,7 +17,7 @@
 import javax.validation.constraints.NotNull;
 
 
-@Api(value = "影视作品评论点赞", tags = "影视作品评论点赞")
+@Api(value = "评论点赞", tags = "评论点赞")
 @RestController
 @RequestMapping("/v2/comment-likes")
 @RequiredArgsConstructor
@@ -26,27 +26,27 @@
     private final CommentLikesService commentLikesService;
 
     @GetMapping("/commentLikes/list")
-    @ApiOperation(value = "影视作品评论点赞列表", httpMethod = "GET")
+    @ApiOperation(value = "评论点赞列表", httpMethod = "GET")
     public ResponseEntity<ReturnDataDTO<Page<CommentLikesVO>>> getCommentLikesList(Page page, CommentLikesQueryDTO dto) {
         return returnData(R.SUCCESS.getCode(), commentLikesService.queryPage(dto, page));
     }
 
     @GetMapping(value = "/commentLikes/delete")
-    @ApiOperation(value = "删除影视作品评论点赞 ", httpMethod = "GET", notes = "ID")
+    @ApiOperation(value = "删除评论点赞 ", httpMethod = "GET", notes = "ID")
     public ResponseEntity delete(@NotNull(message = "id不能为空") Long id) {
         commentLikesService.deleteCommentLikes(String.valueOf(id));
         return returnData(R.SUCCESS.getCode(), null);
     }
 
     @PostMapping(value = "/commentLikes/new")
-    @ApiOperation(value = "保存影视作品评论点赞", httpMethod = "POST")
+    @ApiOperation(value = "保存评论点赞", httpMethod = "POST")
     public ResponseEntity insert(@RequestBody CommentLikesDTO commentLikesDTO) {
         commentLikesService.saveCommentLikes(commentLikesDTO);
         return returnData(R.SUCCESS.getCode(), null);
     }
 
     @PostMapping(value = "/commentLikes/edit")
-    @ApiOperation(value = "更新影视作品评论点赞", httpMethod = "POST")
+    @ApiOperation(value = "更新评论点赞", httpMethod = "POST")
     public ResponseEntity update(@RequestBody CommentLikesDTO commentLikesDTO) {
         commentLikesService.updateCommentLikes(commentLikesDTO);
         return returnData(R.SUCCESS.getCode(), null);
diff --git a/src/main/resources/mapper/film/CommentPoExMapper.xml b/src/main/resources/mapper/film/CommentPoExMapper.xml
new file mode 100644
index 0000000..183171c
--- /dev/null
+++ b/src/main/resources/mapper/film/CommentPoExMapper.xml
@@ -0,0 +1,54 @@
+<?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.CommentPoExMapper">
+    <resultMap id="BaseResultMap" type="com.mzl.flower.entity.film.CommentPo">
+        <id column="id" jdbcType="INTEGER" property="id"/>
+        <result column="parent_id" jdbcType="INTEGER" property="parentId"/>
+        <result column="content" jdbcType="VARCHAR" property="content"/>
+        <result column="film_id" jdbcType="INTEGER" property="filmId"/>
+        <result column="state" jdbcType="BIT" property="state"/>
+        <result column="deleted" jdbcType="BIT" property="deleted"/>
+        <result column="create_by" jdbcType="BIGINT" property="createBy"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fs_comment.id, fs_comment.parent_id, fs_comment.content, fs_comment.film_id, fs_comment.`state`, fs_comment.deleted,
+        fs_comment.create_by, fs_comment.create_time, fs_comment.update_time
+    </sql>
+
+    <select id="selectLatestComments" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from fs_comment left join fs_article on fs_comment.film_id = fs_article.id
+        where fs_comment.deleted = 0
+        and fs_comment.state = 1
+        and fs_article.state = 1
+        and fs_article.deleted = 0
+        order by fs_comment.id desc
+    </select>
+
+    <select id="getAllArticleComment" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from fs_comment left join fs_article on fs_comment.film_id = fs_article.id
+        where fs_comment.deleted = 0
+        and fs_comment.state = 1
+        and fs_article.state = 1
+        and fs_comment.create_time between #{startTime} and #{endTime}
+        and fs_comment.parent_id = 0
+    </select>
+
+    <select id="getAllCommentReply" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from fs_comment left join fs_article on fs_comment.film_id = fs_article.id
+        where fs_comment.deleted = 0
+        and fs_comment.state = 1
+        and fs_article.state = 1
+        and fs_comment.create_time between #{startTime} and #{endTime}
+        and fs_comment.parent_id != 0
+    </select>
+
+</mapper>
diff --git a/src/main/resources/mapper/film/CommentPoMapper.xml b/src/main/resources/mapper/film/CommentPoMapper.xml
new file mode 100644
index 0000000..c53db12
--- /dev/null
+++ b/src/main/resources/mapper/film/CommentPoMapper.xml
@@ -0,0 +1,279 @@
+<?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.CommentPoMapper">
+  <resultMap id="BaseResultMap" type="com.mzl.flower.entity.film.CommentPo">
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="parent_id" jdbcType="INTEGER" property="parentId" />
+    <result column="content" jdbcType="VARCHAR" property="content" />
+    <result column="film_id" jdbcType="INTEGER" property="filmId" />
+    <result column="state" jdbcType="BIT" property="state" />
+    <result column="deleted" jdbcType="BIT" property="deleted" />
+    <result column="create_by" jdbcType="BIGINT" property="createBy" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, parent_id, content, film_id, `state`, deleted, create_by, create_time, 
+    update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.mzl.flower.entity.film.CommentPoExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from film_comments
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from film_comments
+    where id = #{id,jdbcType=INTEGER}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
+    delete from film_comments
+    where id = #{id,jdbcType=INTEGER}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.mzl.flower.entity.film.CommentPoExample">
+    delete from film_comments
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.mzl.flower.entity.film.CommentPo" useGeneratedKeys="true">
+    insert into film_comments (parent_id, content, film_id, 
+      `state`, deleted, create_by, 
+      create_time, update_time)
+    values (#{parentId,jdbcType=INTEGER}, #{content,jdbcType=VARCHAR}, #{filmId,jdbcType=INTEGER}, 
+      #{state,jdbcType=BIT}, #{deleted,jdbcType=BIT}, #{createBy,jdbcType=BIGINT}, 
+      #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.mzl.flower.entity.film.CommentPo" useGeneratedKeys="true">
+    insert into film_comments
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="parentId != null">
+        parent_id,
+      </if>
+      <if test="content != null">
+        content,
+      </if>
+      <if test="filmId != null">
+        film_id,
+      </if>
+      <if test="state != null">
+        `state`,
+      </if>
+      <if test="deleted != null">
+        deleted,
+      </if>
+      <if test="createBy != null">
+        create_by,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="parentId != null">
+        #{parentId,jdbcType=INTEGER},
+      </if>
+      <if test="content != null">
+        #{content,jdbcType=VARCHAR},
+      </if>
+      <if test="filmId != null">
+        #{filmId,jdbcType=INTEGER},
+      </if>
+      <if test="state != null">
+        #{state,jdbcType=BIT},
+      </if>
+      <if test="deleted != null">
+        #{deleted,jdbcType=BIT},
+      </if>
+      <if test="createBy != null">
+        #{createBy,jdbcType=BIGINT},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.mzl.flower.entity.film.CommentPoExample" resultType="java.lang.Long">
+    select count(*) from film_comments
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update film_comments
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=INTEGER},
+      </if>
+      <if test="record.parentId != null">
+        parent_id = #{record.parentId,jdbcType=INTEGER},
+      </if>
+      <if test="record.content != null">
+        content = #{record.content,jdbcType=VARCHAR},
+      </if>
+      <if test="record.filmId != null">
+        film_id = #{record.filmId,jdbcType=INTEGER},
+      </if>
+      <if test="record.state != null">
+        `state` = #{record.state,jdbcType=BIT},
+      </if>
+      <if test="record.deleted != null">
+        deleted = #{record.deleted,jdbcType=BIT},
+      </if>
+      <if test="record.createBy != null">
+        create_by = #{record.createBy,jdbcType=BIGINT},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update film_comments
+    set id = #{record.id,jdbcType=INTEGER},
+      parent_id = #{record.parentId,jdbcType=INTEGER},
+      content = #{record.content,jdbcType=VARCHAR},
+      film_id = #{record.filmId,jdbcType=INTEGER},
+      `state` = #{record.state,jdbcType=BIT},
+      deleted = #{record.deleted,jdbcType=BIT},
+      create_by = #{record.createBy,jdbcType=BIGINT},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.mzl.flower.entity.film.CommentPo">
+    update film_comments
+    <set>
+      <if test="parentId != null">
+        parent_id = #{parentId,jdbcType=INTEGER},
+      </if>
+      <if test="content != null">
+        content = #{content,jdbcType=VARCHAR},
+      </if>
+      <if test="filmId != null">
+        film_id = #{filmId,jdbcType=INTEGER},
+      </if>
+      <if test="state != null">
+        `state` = #{state,jdbcType=BIT},
+      </if>
+      <if test="deleted != null">
+        deleted = #{deleted,jdbcType=BIT},
+      </if>
+      <if test="createBy != null">
+        create_by = #{createBy,jdbcType=BIGINT},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.mzl.flower.entity.film.CommentPo">
+    update film_comments
+    set parent_id = #{parentId,jdbcType=INTEGER},
+      content = #{content,jdbcType=VARCHAR},
+      film_id = #{filmId,jdbcType=INTEGER},
+      `state` = #{state,jdbcType=BIT},
+      deleted = #{deleted,jdbcType=BIT},
+      create_by = #{createBy,jdbcType=BIGINT},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+
+  <!-- CommentPoMapper.xml -->
+  <select id="selectByArticleId" resultType="com.mzl.flower.entity.film.CommentPo">
+    SELECT *
+    FROM film_comments
+    WHERE film_id = #{filmId}
+      AND deleted = false
+      AND state = true
+  </select>
+
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/film/LikeCommentPoExMapper.xml b/src/main/resources/mapper/film/LikeCommentPoExMapper.xml
new file mode 100644
index 0000000..c7e0e2e
--- /dev/null
+++ b/src/main/resources/mapper/film/LikeCommentPoExMapper.xml
@@ -0,0 +1,27 @@
+<?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.LikeCommentPoExMapper">
+<!--  <resultMap id="BaseResultMap" type="com.liang.bbs.user.persistence.entity.LikeCommentPo">-->
+<!--    <id column="id" jdbcType="INTEGER" property="id" />-->
+<!--    <result column="comment_id" jdbcType="INTEGER" property="commentId" />-->
+<!--    <result column="state" jdbcType="BIT" property="state" />-->
+<!--    <result column="like_user" jdbcType="BIGINT" property="likeUser" />-->
+<!--    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />-->
+<!--    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />-->
+<!--  </resultMap>-->
+
+<!--  <sql id="Base_Column_List">-->
+<!--    fs_comment_like.id, fs_comment_like.comment_id, fs_comment_like.`state`, fs_comment_like.like_user, fs_comment_like.create_time, fs_comment_like.update_time-->
+<!--  </sql>-->
+
+<!--  <select id="selectAllCommentLike" resultMap="BaseResultMap">-->
+<!--    select-->
+<!--    <include refid="Base_Column_List"/>-->
+<!--    from fs_comment_like left join fs_comment on fs_comment_like.comment_id = fs_comment.id-->
+<!--    where fs_comment_like.state = 1-->
+<!--    and fs_comment.is_deleted = 0-->
+<!--    and fs_comment.state = 1-->
+<!--    and fs_comment_like.create_time between #{startTime} and #{endTime}-->
+<!--  </select>-->
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/film/LikeCommentPoMapper.xml b/src/main/resources/mapper/film/LikeCommentPoMapper.xml
new file mode 100644
index 0000000..b043272
--- /dev/null
+++ b/src/main/resources/mapper/film/LikeCommentPoMapper.xml
@@ -0,0 +1,220 @@
+<?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.LikeCommentPoMapper">
+<!--  <resultMap id="BaseResultMap" type="com.liang.bbs.user.persistence.entity.LikeCommentPo">-->
+<!--    <id column="id" jdbcType="INTEGER" property="id" />-->
+<!--    <result column="comment_id" jdbcType="INTEGER" property="commentId" />-->
+<!--    <result column="state" jdbcType="BIT" property="state" />-->
+<!--    <result column="like_user" jdbcType="BIGINT" property="likeUser" />-->
+<!--    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />-->
+<!--    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />-->
+<!--  </resultMap>-->
+<!--  <sql id="Example_Where_Clause">-->
+<!--    <where>-->
+<!--      <foreach collection="oredCriteria" item="criteria" separator="or">-->
+<!--        <if test="criteria.valid">-->
+<!--          <trim prefix="(" prefixOverrides="and" suffix=")">-->
+<!--            <foreach collection="criteria.criteria" item="criterion">-->
+<!--              <choose>-->
+<!--                <when test="criterion.noValue">-->
+<!--                  and ${criterion.condition}-->
+<!--                </when>-->
+<!--                <when test="criterion.singleValue">-->
+<!--                  and ${criterion.condition} #{criterion.value}-->
+<!--                </when>-->
+<!--                <when test="criterion.betweenValue">-->
+<!--                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}-->
+<!--                </when>-->
+<!--                <when test="criterion.listValue">-->
+<!--                  and ${criterion.condition}-->
+<!--                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">-->
+<!--                    #{listItem}-->
+<!--                  </foreach>-->
+<!--                </when>-->
+<!--              </choose>-->
+<!--            </foreach>-->
+<!--          </trim>-->
+<!--        </if>-->
+<!--      </foreach>-->
+<!--    </where>-->
+<!--  </sql>-->
+<!--  <sql id="Update_By_Example_Where_Clause">-->
+<!--    <where>-->
+<!--      <foreach collection="example.oredCriteria" item="criteria" separator="or">-->
+<!--        <if test="criteria.valid">-->
+<!--          <trim prefix="(" prefixOverrides="and" suffix=")">-->
+<!--            <foreach collection="criteria.criteria" item="criterion">-->
+<!--              <choose>-->
+<!--                <when test="criterion.noValue">-->
+<!--                  and ${criterion.condition}-->
+<!--                </when>-->
+<!--                <when test="criterion.singleValue">-->
+<!--                  and ${criterion.condition} #{criterion.value}-->
+<!--                </when>-->
+<!--                <when test="criterion.betweenValue">-->
+<!--                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}-->
+<!--                </when>-->
+<!--                <when test="criterion.listValue">-->
+<!--                  and ${criterion.condition}-->
+<!--                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">-->
+<!--                    #{listItem}-->
+<!--                  </foreach>-->
+<!--                </when>-->
+<!--              </choose>-->
+<!--            </foreach>-->
+<!--          </trim>-->
+<!--        </if>-->
+<!--      </foreach>-->
+<!--    </where>-->
+<!--  </sql>-->
+<!--  <sql id="Base_Column_List">-->
+<!--    id, comment_id, `state`, like_user, create_time, update_time-->
+<!--  </sql>-->
+<!--  <select id="selectByExample" parameterType="com.liang.bbs.user.persistence.entity.LikeCommentPoExample" resultMap="BaseResultMap">-->
+<!--    select-->
+<!--    <if test="distinct">-->
+<!--      distinct-->
+<!--    </if>-->
+<!--    <include refid="Base_Column_List" />-->
+<!--    from fs_comment_like-->
+<!--    <if test="_parameter != null">-->
+<!--      <include refid="Example_Where_Clause" />-->
+<!--    </if>-->
+<!--    <if test="orderByClause != null">-->
+<!--      order by ${orderByClause}-->
+<!--    </if>-->
+<!--  </select>-->
+<!--  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">-->
+<!--    select -->
+<!--    <include refid="Base_Column_List" />-->
+<!--    from fs_comment_like-->
+<!--    where id = #{id,jdbcType=INTEGER}-->
+<!--  </select>-->
+<!--  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">-->
+<!--    delete from fs_comment_like-->
+<!--    where id = #{id,jdbcType=INTEGER}-->
+<!--  </delete>-->
+<!--  <delete id="deleteByExample" parameterType="com.liang.bbs.user.persistence.entity.LikeCommentPoExample">-->
+<!--    delete from fs_comment_like-->
+<!--    <if test="_parameter != null">-->
+<!--      <include refid="Example_Where_Clause" />-->
+<!--    </if>-->
+<!--  </delete>-->
+<!--  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.liang.bbs.user.persistence.entity.LikeCommentPo" useGeneratedKeys="true">-->
+<!--    insert into fs_comment_like (comment_id, `state`, like_user, -->
+<!--      create_time, update_time)-->
+<!--    values (#{commentId,jdbcType=INTEGER}, #{state,jdbcType=BIT}, #{likeUser,jdbcType=BIGINT}, -->
+<!--      #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})-->
+<!--  </insert>-->
+<!--  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.liang.bbs.user.persistence.entity.LikeCommentPo" useGeneratedKeys="true">-->
+<!--    insert into fs_comment_like-->
+<!--    <trim prefix="(" suffix=")" suffixOverrides=",">-->
+<!--      <if test="commentId != null">-->
+<!--        comment_id,-->
+<!--      </if>-->
+<!--      <if test="state != null">-->
+<!--        `state`,-->
+<!--      </if>-->
+<!--      <if test="likeUser != null">-->
+<!--        like_user,-->
+<!--      </if>-->
+<!--      <if test="createTime != null">-->
+<!--        create_time,-->
+<!--      </if>-->
+<!--      <if test="updateTime != null">-->
+<!--        update_time,-->
+<!--      </if>-->
+<!--    </trim>-->
+<!--    <trim prefix="values (" suffix=")" suffixOverrides=",">-->
+<!--      <if test="commentId != null">-->
+<!--        #{commentId,jdbcType=INTEGER},-->
+<!--      </if>-->
+<!--      <if test="state != null">-->
+<!--        #{state,jdbcType=BIT},-->
+<!--      </if>-->
+<!--      <if test="likeUser != null">-->
+<!--        #{likeUser,jdbcType=BIGINT},-->
+<!--      </if>-->
+<!--      <if test="createTime != null">-->
+<!--        #{createTime,jdbcType=TIMESTAMP},-->
+<!--      </if>-->
+<!--      <if test="updateTime != null">-->
+<!--        #{updateTime,jdbcType=TIMESTAMP},-->
+<!--      </if>-->
+<!--    </trim>-->
+<!--  </insert>-->
+<!--  <select id="countByExample" parameterType="com.liang.bbs.user.persistence.entity.LikeCommentPoExample" resultType="java.lang.Long">-->
+<!--    select count(*) from fs_comment_like-->
+<!--    <if test="_parameter != null">-->
+<!--      <include refid="Example_Where_Clause" />-->
+<!--    </if>-->
+<!--  </select>-->
+<!--  <update id="updateByExampleSelective" parameterType="map">-->
+<!--    update fs_comment_like-->
+<!--    <set>-->
+<!--      <if test="record.id != null">-->
+<!--        id = #{record.id,jdbcType=INTEGER},-->
+<!--      </if>-->
+<!--      <if test="record.commentId != null">-->
+<!--        comment_id = #{record.commentId,jdbcType=INTEGER},-->
+<!--      </if>-->
+<!--      <if test="record.state != null">-->
+<!--        `state` = #{record.state,jdbcType=BIT},-->
+<!--      </if>-->
+<!--      <if test="record.likeUser != null">-->
+<!--        like_user = #{record.likeUser,jdbcType=BIGINT},-->
+<!--      </if>-->
+<!--      <if test="record.createTime != null">-->
+<!--        create_time = #{record.createTime,jdbcType=TIMESTAMP},-->
+<!--      </if>-->
+<!--      <if test="record.updateTime != null">-->
+<!--        update_time = #{record.updateTime,jdbcType=TIMESTAMP},-->
+<!--      </if>-->
+<!--    </set>-->
+<!--    <if test="_parameter != null">-->
+<!--      <include refid="Update_By_Example_Where_Clause" />-->
+<!--    </if>-->
+<!--  </update>-->
+<!--  <update id="updateByExample" parameterType="map">-->
+<!--    update fs_comment_like-->
+<!--    set id = #{record.id,jdbcType=INTEGER},-->
+<!--      comment_id = #{record.commentId,jdbcType=INTEGER},-->
+<!--      `state` = #{record.state,jdbcType=BIT},-->
+<!--      like_user = #{record.likeUser,jdbcType=BIGINT},-->
+<!--      create_time = #{record.createTime,jdbcType=TIMESTAMP},-->
+<!--      update_time = #{record.updateTime,jdbcType=TIMESTAMP}-->
+<!--    <if test="_parameter != null">-->
+<!--      <include refid="Update_By_Example_Where_Clause" />-->
+<!--    </if>-->
+<!--  </update>-->
+<!--  <update id="updateByPrimaryKeySelective" parameterType="com.liang.bbs.user.persistence.entity.LikeCommentPo">-->
+<!--    update fs_comment_like-->
+<!--    <set>-->
+<!--      <if test="commentId != null">-->
+<!--        comment_id = #{commentId,jdbcType=INTEGER},-->
+<!--      </if>-->
+<!--      <if test="state != null">-->
+<!--        `state` = #{state,jdbcType=BIT},-->
+<!--      </if>-->
+<!--      <if test="likeUser != null">-->
+<!--        like_user = #{likeUser,jdbcType=BIGINT},-->
+<!--      </if>-->
+<!--      <if test="createTime != null">-->
+<!--        create_time = #{createTime,jdbcType=TIMESTAMP},-->
+<!--      </if>-->
+<!--      <if test="updateTime != null">-->
+<!--        update_time = #{updateTime,jdbcType=TIMESTAMP},-->
+<!--      </if>-->
+<!--    </set>-->
+<!--    where id = #{id,jdbcType=INTEGER}-->
+<!--  </update>-->
+<!--  <update id="updateByPrimaryKey" parameterType="com.liang.bbs.user.persistence.entity.LikeCommentPo">-->
+<!--    update fs_comment_like-->
+<!--    set comment_id = #{commentId,jdbcType=INTEGER},-->
+<!--      `state` = #{state,jdbcType=BIT},-->
+<!--      like_user = #{likeUser,jdbcType=BIGINT},-->
+<!--      create_time = #{createTime,jdbcType=TIMESTAMP},-->
+<!--      update_time = #{updateTime,jdbcType=TIMESTAMP}-->
+<!--    where id = #{id,jdbcType=INTEGER}-->
+<!--  </update>-->
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/system/UserMapper.xml b/src/main/resources/mapper/system/UserMapper.xml
index 037278e..9b660c9 100644
--- a/src/main/resources/mapper/system/UserMapper.xml
+++ b/src/main/resources/mapper/system/UserMapper.xml
@@ -167,4 +167,15 @@
             </if>
         </where>
     </select>
+
+
+    <select id="getByIds" resultType="com.mzl.flower.entity.system.User">
+        SELECT
+        u.*
+        FROM t_user u
+        WHERE u.id IN
+        <foreach collection="userIds" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

--
Gitblit v1.9.3