这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
需求分析
用户可以对评论进行操作,添加评论或者删除评论,同时能够在对应的视频根据时间倒序看见评论。
/douyin/comment/action/ - 评论操作
- 登录用户对视频进行评论。
- 接口类型:POST
/douyin/comment/list/ - 视频评论列表
- 查看视频的所有评论,按发布时间倒序。
- 接口类型: GET
接口定义
syntax = "proto3";
package comment;
option go_package = "comment";
message BaseResp {
int32 status_code = 1;//状态码
string status_message = 2;//状态描述
int64 service_time = 3;//服务时间
}
message User {
int64 id = 1;//用户id
string name = 2;//用户名称
int64 follow_count = 3;//关注总数
int64 follower_count = 4;//粉丝总数
bool is_follow = 5;//true-已关注,false-未关注
string avatar = 6; // 用户头像
string background_image = 7; // 用户个人页顶部大图
string signature = 8; // 个人简介
int64 total_favorited = 9; // 获赞数量
int64 work_count = 10; // 作品数量
int64 favorite_count = 11; // 点赞数量
}
message Comment {
int64 id = 1;//视频评论id
User user = 2;//评论用户信息
string content = 3;//评论内容
string create_date = 4;//评论发布日期,格式mm-dd
int64 like_count = 5;// 该评论点赞数量
int64 tease_count = 6; // 该评论diss数量
}
message create_comment_request {
string token = 1;//用户鉴权token
int64 video_id = 2;//视频id
string comment_text = 3;////用户填写的评论内容
}
message create_comment_response {
BaseResp base_resp = 1;
Comment comment = 2;//评论成功返回评论内容,不需要重新拉取整个列表
}
message delete_comment_request {
string token = 1;//用户鉴权token
int64 video_id = 2;//视频id
int64 comment_id = 3;//要删除的评论id
}
message delete_comment_response {
BaseResp base_resp = 1;
Comment comment = 2;//评论成功返回评论内容,不需要重新拉取整个列表
}
message comment_list_request {
string token = 1;//用户鉴权token
int64 video_id = 2;//视频id
}
message comment_list_response {
BaseResp base_resp = 1;
repeated Comment comment_list = 2;//评论列表
}
service CommentService {
rpc CreateComment (create_comment_request) returns (create_comment_response) {}
rpc DeleteComment (delete_comment_request) returns (delete_comment_response) {}
rpc CommentList (comment_list_request) returns (comment_list_response) {}
}
这里接口定义和官方提供的稍有不同,把评论操作分为添加和删除两个操作了。这样在 api 层区分一下调用更加方便点。
数据表定义
// CommentRaw Comment Gorm Data Structures
type CommentRaw struct {
gorm.Model
UserId int64 `gorm:"column:user_id;not null;index:idx_userid"`
VideoId int64 `gorm:"column:video_id;not null;index:idx_videoid"`
Content string `gorm:"column:content;type:varchar(255);not null"`
}
评论表包含一个用户 ID、一个视频 ID 以及评论的内容。这样的话添加和删除评论只需要根据 userId 以及 videoId 就很容易查找到。
微服务流程
评论操作
- api 层首先对获得的请求进行解析,得到基本的 token、vedioId 以及 action_type,对其中的参数进行校验;
- 接着根据 action_type 判断是添加评论还是删除评论,然后调用相应的 service 层进行处理;
- service 层接收到请求后,首先 token 用 JWT 进行认证,然后调用 dal 层添加或删除评论;
- 最后根据 dal 层得到的信息返回给 service 层,在返回给 api 层。
评论列表
评论列表和上述流程差不多,不太一样的是需要在 dal 层得到用户信息,也就是返回的信息要多一点。