今天先写一下我的多级留言/评论功能的数据库和后端是怎么设计的(前端的设计会再写一篇单独的文章) 删除评论还没做,这个功能还没有思路,目前也没有太多时间来设计了,搜了一下感觉挺复杂的,后面有时间了会补上
接下来文章里说的留言和评论指的都是同一个东西!!!因为我需求一开始就是叫留言功能,但是评论这俩字儿可能比较顺口🤣
如果你能耐心看完这篇文章,应该会有自己的整体思路和大概方向了,接下来就是根据思路去完善你的需求,用代码实现即可!
若有错漏,欢迎指出!
想要实现类似bilibili的评论区那样,在我的药材、方剂、文章详情页下都实现多级留言功能,但是不以递进的方式来展现层级关系
解释: 顶级留言 = 一级留言 = 根留言,子留言从二级留言开始,三级,四级… 二级留言直接挂在一级留言的下面,三级及以上留言显示的位置与二级留言是保持 ,用 来区分。我的实现图如下:
补充: 我这里的 字段是参考了博主 黄金贼贼 的这篇文章,觉得后面会用上,就也加上了; 、 字段我目前没用到,设计的时候想到啥就写上了,可以先不用关注这两个字段; 字段我用上了,但是感觉其实可以不设置,有点冗余,可以看你自己的具体实现决定是否需要该字段; 还有就是,我整个系统除了收藏、认证方剂功能外,用的都是逻辑删除,所以会设置一个字段。
附上sql建表语句,根据自己的需求更改:
前提: 用户表:需要有用户ID(必须),用户名/昵称/角色身份等字段(根据你需要显示的需求来定) 被关联的主体的表:关联主体ID(我这里的存放的是三张被关联主体表的ID,可以存药材ID 或 方剂ID 或 文章ID,因为我这三个主体都需要有留言功能)简单点说就是,你要在哪个内容下面用这个留言功能,这个关联的主体就是它
解释: 简单讲一下几个字段 字段:因为我要将药材、方剂、文章的留言都存在同一张表,需要这个字段进行区分(但是不推荐这么做,因为我数据量小,这样能快速实现功能且省事) 字段:每一条评论的直接父留言ID,存放的可能为顶级留言ID,也可能是子留言ID(如,子留言也会有子留言[或者说成回复],那它本身就是自己子留言的直接父亲;这个字段主要用于实现那个 功能点,被艾特的nickname是被留言[或回复]的二级、三级、四级…等留言的发表人昵称) 字段:用于区别顶级留言与子留言。这个字段会用于查出全部顶级留言返回一个列表,根据结果列表可以进一步进行子留言查询(这里我还利用 PageHelper 做了分页)
entity 完整实体类
项目使用了工具
dto 封装请求数据
在接口开发时,一般不直接使用完整实体类,而是使用 dto 类进行开发进行; 项目中使用了进行参数校验
为什么刚刚我的数据库表里定义为类型的字段,这里都改用了类型呢? 这里解释一下: 在数据库中,类型用于存储较大的整数值,而在某些编程环境中,如Java的IDE(例如IntelliJ IDEA),这个类型通常会被映射为类型。这是因为类型在Java中用于表示64位的整数,与数据库中的类型相对应; 类型在Java中是标准的整数类型之一,用于表示较大的整数值,与数据库中的类型兼容; IDE为了简化开发过程,会自动(为啥说自动呢,因为我的实体类是在idea中连接了mysql后,直接使用"脚本扩展 groovy"进行创建的,并非我手动创建) 将数据库中的类型映射为Java中最常用的对应类型,以便开发者可以直接使用而不需要额外的类型转换; 另外,Java提供了类,但这通常会增加代码的复杂性。在对性能不是特别敏感的场景下,可以使用来处理更大的数值。
dto 封装分页请求数据
如果你没有分页需求,可以不用管这个
vo 请求返回数据
封装响应给客户端的数据
重点提一下最后的三个字段,数据库表中是没有这三个字段的,这是在做sql多表查询时额外返回的字段,前端需要这些数据;若你没有显示用户身份需求的话,可以省略字段。 子评论列表很重要,这里存放了顶级评论下所有的子评论,一层层嵌套的,后面会说怎么用
解释一哈:
添加评论
- 需要提交的数据封装在中传给后端,后端使用接收数据;
- 其中,评论内容、关联主体ID、评论类型均不能为空
获取评论列表
- 请求数据时需要提交 中的数据,并使用 进行参数的校验;
- 这里使用了 进行分页处理(不做展示,网上教程也很多其实,或者私聊我获取这部分代码),所以返回的 数据需要用 包裹返回;
- 是我自己封装的通用的结果返回类,你也可以直接写成 但是在你的接口实现类(Impl) 处需要返回对应的列表数据给前端
接口
实现类
若这部分有疑问可以移步文章末尾看看返回的数据结构,结合起来再看看这段代码,可能会更清楚,若还有疑问,可以在评论区留言😁
这里使用到了左连接进行多表查询,只是看起来复杂,仔细看看语句应该都能看懂。 主要提一下,这里将查到的昵称、头像、角色名使用别名对应了前面 vo 那几个字段,返回给前端使用:
后端的设计到这里就结束了,删除评论的接口还没有设计,后面有时间补上😁
展示一下返回的评论列表是怎么样的,便于理解递归和 字段。 示例中总共有7条顶级留言,但我是分页查询,本页我只查了3条:
- 第一条id为 20240437 的顶级留言,没有子留言,故字段为空。
- 第二条id为 20240418 的顶级留言,只有1条二级子留言。
- 第三条id为 20240402 的顶级留言,有3条二级留言。其中第一条二级留言下有一条三级留言(也可以有多条,我这里只是示例数据的结构),该三级留言下有一条四级留言,该四级留言下没有子留言了(后面还有五级、六级也是这个结构),字段为空
若看着不方便,你可以cv到一些可以展示 格式数据的平台或编辑器上(如浏览器插件FeHelper),折叠着看,会更清楚,记得把我的注释去掉
FeHelper插件里,整体展示