网易云音乐评论功能实现(数据库设计)

数据表设计

1、需求分析(一问一答模式)

这种设计简单、直接,也满足了用户评论、回复的基本要求,对于没有大量用户评论的APP需求足够。

2、数据库字段设计 

                                             表字段                                           字段说明
id主键
show_id主题id (音乐或MV)
user_id评论用户userId
content评论内容(长度限制为140个中文汉字)
give_like点赞总量
create_time评论时间
state评论状态(正常默认 1,已删除 0)
reply_id回复评论id

因为我数据库没有冗余评论用户头像和昵称,需要根据user_id去查询,返回到一个评论中间类中

reply_id  字段默认为null,该字段不为null时,表示该条评论是回复别人的评论,用于设置回复某条评论的主键id

state 字段是会用到的,主要场景如下图

回复评论作者已经删除评论的话,不显示原评论的所有信息

3、返回评论列表

返回评论的数据结构这里,我用到了三个类(评论类、评论中间类、最终返回的评论类)

评论类

package com.shinemi.realiart.model;

import java.util.Date;
// 评论类
public class ArtShowComments {
    private Long id;

    private Long showId;

    private Long userId;

    private String content;

    private Long giveLike;

    private Date createTime;

    private Integer state;

    private Long replyId;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getShowId() {
        return showId;
    }

    public void setShowId(Long showId) {
        this.showId = showId;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content == null ? null : content.trim();
    }

    public Long getGiveLike() {
        return giveLike;
    }

    public void setGiveLike(Long giveLike) {
        this.giveLike = giveLike;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    public Long getReplyId() {
        return replyId;
    }

    public void setReplyId(Long replyId) {
        this.replyId = replyId;
    }
}

 

评论中间类(继承了评论类,添加多两个成员变量,头像与昵称) 

package com.shinemi.realiart.bean;

import com.shinemi.realiart.model.ArtShowComments;

// 评论中间类
public class ArtShowCommentsBean extends ArtShowComments {
    // 评论用户头像
    private String userHeadPortrait;
    // 评论用户昵称
    private String userNickName;

    public void setArtShowComments(ArtShowComments artShowComments) {
        this.setId(artShowComments.getId());
        this.setShowId(artShowComments.getShowId());
        this.setUserId(artShowComments.getUserId());
        this.setContent(artShowComments.getContent());
        this.setGiveLike(artShowComments.getGiveLike());
        this.setCreateTime(artShowComments.getCreateTime());
        this.setState(artShowComments.getState());
        this.setReplyId(artShowComments.getReplyId());
    }

    public String getUserHeadPortrait() {
        return userHeadPortrait;
    }

    public void setUserHeadPortrait(String userHeadPortrait) {
        this.userHeadPortrait = userHeadPortrait;
    }

    public String getUserNickName() {
        return userNickName;
    }

    public void setUserNickName(String userNickName) {
        this.userNickName = userNickName;
    }

}

评论返回类(该类中有三个变量,那就是上面的评论中间类和评论拥有者的状态了,评论拥有者主要给予前端判断该评论是否能让当前用户删除)

package com.shinemi.realiart.bean;

// 评论返回类
public class ArtShowCommentsBO {
    // 原评论
    private ArtShowCommentsBean originalComments;
    // 回复评论
    private ArtShowCommentsBean replyComments;
    // 评论拥有者
    private boolean realyReviewers;

    public ArtShowCommentsBean getOriginalComments() {
        return originalComments;
    }

    public void setOriginalComments(ArtShowCommentsBean originalComments) {
        this.originalComments = originalComments;
    }

    public ArtShowCommentsBean getReplyComments() {
        return replyComments;
    }

    public void setReplyComments(ArtShowCommentsBean replyComments) {
        this.replyComments = replyComments;
    }

    public boolean isRealyReviewers() {
        return realyReviewers;
    }

    public void setRealyReviewers(boolean realyReviewers) {
        this.realyReviewers = realyReviewers;
    }
}

思路流程是这样的:

根据主题id 分页查询 评论表,将获取回来的评论进行遍历,判断reply_id是否为null,是的话new 中间类对象,将评论对象设置进去,再查出评论者头像and昵称设置,完成后创建评论返回类、将刚刚的评论中间类set 入 评论返回类的 originalComments就ok了

reply_id 不为null、就需要根据reply_id去查询评论类、再同上的操作、就是最后set 入 评论返回类的 replyComments字段中就ok

以上是个人观点设计,若有不足的地方或更好的设计,欢迎提出。

 

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值