cloudroam
2025-06-04 ed0dc655e6732f15d30f399c0d460ad7b9fe42da
add:影视作品点赞和评论点赞
已修改13个文件
已添加19个文件
2737 ■■■■■ 文件已修改
pom.xml 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/film/CommentLikesDTO.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/film/CommentSearchDTO.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/film/FilmLikesDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/response/film/CommentDTO.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/entity/film/CommentLikes.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/entity/film/CommentPo.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/entity/film/CommentPoExample.java 809 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/enums/SortRuleEnum.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/film/CommentLikesMapper.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/film/CommentMS.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/film/CommentPoExMapper.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/film/CommentPoMapper.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/film/CommonMS.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/film/FilmLikesMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/film/LikeCommentPoExMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/film/LikeCommentPoMapper.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/film/CommentLikesService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/film/CommentService.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/film/FilmLikesService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/film/impl/CommentLikesServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/film/impl/CommentServiceImpl.java 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/film/impl/FilmLikesServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/system/UserService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/utils/CommentTreeUtils.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/film/CommentController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/film/CommentLikesController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/film/CommentPoExMapper.xml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/film/CommentPoMapper.xml 279 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/film/LikeCommentPoExMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/film/LikeCommentPoMapper.xml 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/UserMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>
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;
}
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;
}
src/main/java/com/mzl/flower/dto/request/film/FilmLikesDTO.java
@@ -90,7 +90,7 @@
    /**
     * 状态(0禁用,1启用)
     */
    private Integer status;
    private Boolean status;
    /**
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;
}
src/main/java/com/mzl/flower/entity/film/CommentLikes.java
@@ -5,7 +5,7 @@
import lombok.Data;
/**
 * 影视作品点赞表
 * 评论点赞表
 *
 * @author generator@Fang
 * @since 2025-05-29
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;
}
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);
        }
    }
}
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;
    }
}
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);
}
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);
}
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);
}
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);
}
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);
}
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> {
}
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);
}
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);
}
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);
}
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);
}
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);
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);
    }
}
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());
        });
    }
}
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
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);
    }
}
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;
    }
}
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));
    }
}
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);
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>
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>
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>
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>
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>