基于springboot的评论,点赞模块

3 篇文章 0 订阅
1 篇文章 0 订阅

最近刷微博,看抖音发现最有趣的就是看评论了,然后想着自己的项目正好差一个评论模块,所以自己就写了一个点赞评论模块,好了,废话不多说,直接进入主题。
项目地址:点击访问 欢迎各位fork,star

1. 分析阶段

1.先从前端入手,看看前端需要哪些数据(这里以csdn博客评论为列),以博客为例,一篇博客下面可能会有多条评论。每条评论其实分为两种,一种是直接对博客的评论,称之为父评论;另一种是对已有评论的评论(博主回复),称为子评论。点赞就比较好区分了,无论是父评论还是子评论或者博客评论,点赞只要关联被评论对象的唯一标识和点赞用户的id就可以了。一篇博客可以有多条评论,一条父评论,可以有多条子评论。所以博客与评论的关系为一对多,父评论与子评论的关系也是一对多,一个点赞对应一个点赞对象,所以点赞与点赞的对象为一对一,由此则可以设置数据库表。
在这里插入图片描述

2.设计阶段

由此可以得出,评论分为两种:一种为父评论,另一种为子评论。则:
一条父评论至少拥有的属性为:评论的唯一标识评论对象的id评论者的id评论者名字评论者的头像评论的内容评论的点赞数评论发布的时间

一条子评论至少拥有的属性为:父评论的唯一标识评论者的id评论者名字评论者的头像,,被评论者的id被评论者名字被评论者的头像评论的内容评论的点赞数评论发布的时间

一条评论的点赞至少拥有的属性为:被评论对象的唯一标识用户的唯一标识点赞状态
由此就可以设计数据库表了。
父评论表(comments_root)

id主键
type评论的类型,评论博客,评论下载资源等
owner_id评论对象的id
from_id评论者的id
from_name评论者的名字
from_avatar评论者的头像链接
like_num评论的点赞数
content评论的内容
comment_id评论的唯一标识
create_time评论的发布时间

子评论表(comments_reply)

id用来关联父评论的主键id
comment_id子评论的唯一标识
from_id评论者的id
from_name评论者的名字
from_avatar评论者的头像链接
to_id被评论者的id
to_name被评论者的名字
to_avatar被评论者的头像链接
like_num评论的点赞数
content评论的内容
create_time评论的发布时间

点赞表(liked)

id主键
obj_id对应对象的id,可以是文章id或者评论id等
user_id点赞者的id
like_status点赞的状态,1标识已赞,0标识取消赞

3.创建工程

(1)创建springboot项目,然后在项目根目录下的 pom.xml 文件中添加如下依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tl666</groupId>
    <artifactId>comments</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>comments</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

(2)编辑配置文件application.yml或application.properties中添加配置,博主用的是yml格式的配置文件,它格式比较清晰,application.yml

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1/comments?characterEncoding=utf-8&useSSL=false
mybatis:
  configuration:
    mapUnderscoreToCamelCase: true  #开启mabatis的驼峰命名法

(3)然后在springboot中写好对应的实体类即可
(4)然后写数据持久化层CommentsMapper.java

package com.tl666.comments.mapper;

import com.tl666.comments.pojo.CommentsRoot;
import com.tl666.comments.pojo.CommentsReply;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface CommentsMapper {

    /**
     * 获取该文章或资源下的所有评论
     * @param ownerId 文章或资源id
     * @return
     */
//    @Select("select * from comments_info where owner_id = #{ownerId}")
    List<CommentsRoot> findByOwnerId(String ownerId);

    /**
     * 添加子评论或回复评论
     * @param commentsReply
     * @return
     */
    @Insert("insert into comments_reply (id,comment_id,from_id,from_name,from_avatar,to_id,to_name,to_avatar,like_num,content,create_time) " +
            "values(#{id},#{commentId},#{fromId},#{fromName},#{fromAvatar},#{toId},#{toName},#{toAvatar},#{likeNum},#{content},#{createTime})")
    boolean addSonComments(CommentsReply commentsReply);

    /**
     * 添加父评论
     * @param commentsRoot
     * @return
     */
//    @Insert("insert into comments_root (id,comment_id,owner_id,type,from_id,from_name,from_avatar,like_num,content,create_time) " +
//            "values(#{id},#{commentId},#{ownerId},#{type},#{fromId},#{fromName},#{fromAvatar},#{likeNum},#{content},#{createTime})")
    boolean addRootComments(CommentsRoot commentsRoot);
}

对应的mybatis的xml文件CommentsMapper .xml如下

<?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.tl666.comments.mapper.CommentsMapper">
    <select id="findByOwnerId" resultMap="Comnents">
	select * from comments_root where owner_id = #{ownerId}
	</select>
    <resultMap type="com.tl666.comments.pojo.CommentsRoot" id="Comnents">
        <result property="id" column="id" />
        <collection property="listCommentsReply" javaType="ArrayList" ofType="com.tl666.comments.pojo.CommentsReply" column="id"
                    select="getSonComments"></collection>
    </resultMap>
    <select id="getSonComments" resultType="com.tl666.comments.pojo.CommentsReply">
	select * from comments_reply where id = #{id}
	</select>

    <insert id="addRootComments" parameterType="com.tl666.comments.pojo.CommentsRoot" keyProperty="id">
        <selectKey keyProperty='id' resultType='int' order='AFTER'  >
            select LAST_INSERT_ID();
        </selectKey>
        insert into comments_root (id,comment_id,owner_id,type,from_id,from_name,from_avatar,like_num,content,create_time)
        values(#{id},#{commentId},#{ownerId},#{type},#{fromId},#{fromName},#{fromAvatar},#{likeNum},#{content},#{createTime})
    </insert>
</mapper>

(5)控制层的核心代码如下

/**
     * 添加父评论   直接对标文章,资源等下面的评论
     * @param commentsRoot
     * @return
     */
    @PostMapping("addRootComments")
    public ResultDT addRootComments(CommentsRoot commentsRoot) {
        log.info("1" + commentsRoot.toString());
        if (commentsRoot.getContent().length() != 0) {
            commentsRoot.setCommentId(UUID.randomUUID().toString().replaceAll("-", ""));//设置评论唯一标识
            commentsRoot.setCreateTime(new Date());//设置添加评论时间
            log.info("2" + commentsRoot);
            boolean b = commentService.addRootCommentsService(commentsRoot); //调用service方法来完成评论的存储
            log.info("3" + commentsRoot.toString());
            if (b) {
                return ResultDTUtils.success(commentsRoot);
            }
        }
        //评论内容为空 返回错误信息
        return ResultDTUtils.error(ResultDTUtils.COMMENT_ERROR, "addError");
    }

    /**
     * 添加子评论,对应父评论
     * @param commentsReply
     * @return
     */
    @PostMapping("addSonComments")
    public ResultDT addSonComments(CommentsReply commentsReply) {
        log.info("1" + commentsReply.toString());
        if (commentsReply.getContent().length() != 0) {
            commentsReply.setCommentId(UUID.randomUUID().toString().replaceAll("-", ""));//设置评论唯一标识
            commentsReply.setCreateTime(new Date());
            log.info("2" + commentsReply);
            boolean b = commentService.addSonCommentsService(commentsReply);
            log.info("3" + commentsReply.toString());
            if (b) {
                return ResultDTUtils.success(commentsReply);
            }
        }
        return ResultDTUtils.error(ResultDTUtils.COMMENT_ERROR, "addError");
    }

    /**
     * 根据资源ID来回去该资源的所有评论
     * @param request
     * @return
     */
    @GetMapping("getListByOwnerId")
    public ResultDT getListByOwnerId(HttpServletRequest request) {
        String ownerId = request.getParameter("owner_id");
        log.info(ownerId);
        List<CommentsRoot> byOwnerIdService = commentService.findByOwnerIdService(ownerId);
        log.info(byOwnerIdService.toString());
        return ResultDTUtils.success(byOwnerIdService);
    }

(6)评论效果如下图所示:
在这里插入图片描述
点击回复输入框会出现回复的对象的名字
在这里插入图片描述
从后端获取的评论数据
在这里插入图片描述
好了本期的内容就到这里了,由于这个项目是临时起意写的,或许有一些地方不足,但是博主正在努力更新完善功能,本项目已经放到Github上面去了,欢迎各位fork,star。
项目地址:点击访问

我们下期再见!嘿嘿

  • 23
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值