文章目录
一、项目详情
1.1项目介绍
1.2使用技术栈
二、达人探店
2.1发布博客
2.2 查看博客
2.3 删除博客
2.4点赞博客
2.5 点赞排行
2.6 获取指定用户博客
2.7 blog模块的工具代码
三、好友关注
3.1 关注和取关
3.2 共同关注
3.3 Feed流推送
Feed流
3.4 好友关注工具类
四、消息通知(新增功能)
4.1服务端实时推送技术之SSE(Server-Send Events)
4.2案例实现
4.3使用的工具类
一、项目详情
1.1项目介绍
github:项目地址 接口文档:接口文档 本项目是黑马程序员的Redis实战项目,使用Go语言重构的版本。目前项目还在开发中,本文会持续更新。
1.2使用技术栈
框架:字节跳动开源框架-Hertz
IDL:thrift
Redis:set、zset、stream
SSE(Server-Send Events):服务端推送
二、达人探店
达人探店,类似于博客、笔记等功能。涉及到基于基于SortSet的点赞列表和点赞排行。
2.1发布博客
图片不直接存在数据库中,而是存储图片的地址,故发布博客的实现分为两个步骤 流程如上图:
上传图片,获得图片地址
发布博客 前端提交后向数据库插入一条记录
u := utils.GetUser(h.Context).GetID()
req.UserId = u
if !errors.Is(mysql.DB.Create(&req).Error, nil) {
return nil, errors.New("创建失败")
}
req.Icon = utils.GetUser(h.Context).GetIcon()
req.NickName = utils.GetUser(h.Context).GetNickName()
req.IsLiked = false
2.2 查看博客
查看博客时,除了显示博客内容以外还要显示用户头像、是否关注等信息 用户信息使用userDto结构体定义,需要通过user对象转换而来,避免频繁转换,直接将字段定义才Blog结构体中,并使用gorm:-表示不属于blog表的字段,需要忽略
struct Blog {
1: i64 id (go.tag='gorm:"id"');
2: i64 shopId (go.tag='gorm:"shop_id"')
3: i64 userId (go.tag='gorm:"user_id"')
4: string title (go.tag='gorm:"title"')
5: string images (go.tag='gorm:"images"')
6: string content (go.tag='gorm:"content"')
7: i64 liked (go.tag='gorm:"liked"')
8: i64 comments (go.tag='gorm:"comments"')
9: string createTime (go.tag='gorm:"create_time"');
10: string updateTime (go.tag='gorm:"update_time"');
11: string icon (go.tag='gorm:"-"');
12: string nickName (go.tag='gorm:"-"');
13: bool isLiked (go.tag='gorm:"-"');
}
查询逻辑分为3步,1、查询博客数据,2、查询用户信息,3、查询点赞状态
if !errors.Is(mysql.DB.First(&resp, "id = ?", req).Error, nil) {
return nil, errors.New("未找到该博客")
}
userId := resp.UserId
user, err := mysql.GetById(h.Context, userId)
if err != nil {
return nil, err
}
resp.Icon = user.Icon
resp.NickName = user.NickName
resp.IsLiked = false
// 获取点赞状态
u := utils.GetUser(h.Context).GetID()
key := constants.BLOG_LIKED_KEY + *req
isLike, err := redis.IsLiked(h.Context, key, strconv.FormatInt(u, 10))
if err != nil {
return nil, err
}
resp.IsLiked = isLike
return resp, nil
2.3 删除博客
删除博客前要注意同时删除点赞信息和评论信息,最后再删除数据库记录
key := constants.BLOG_LIKED_KEY + *req
// 从redis删除点赞数据
ok, err := redis.HasLikes(h.Context, key)
if err != nil {
return nil, err
}
if ok {
if !errors.Is(redis.DeleteLikes(h.Context, key), nil) {
return nil, err
}
}
// 删除评论信息
bid, err := strconv.ParseInt(*req, 10, 64)
if err != nil {
return nil, err
}
err = mysql.DeleteBlogComment(h.Context, bid)
if !errors.Is(err, nil) {
return nil, err
}
// 从数据库删除博客
err = mysql.DB.Where("id = ?", req).Delete(&blog.Blog{
}).Error
if !errors.Is(err, nil) {
return nil, err
}
2.4点赞博客
点赞功能实现时要判断该博客是否已经点赞过,为了方便实现时将点赞状态写到blog的islike字段中。点赞前判断是否已经点赞,如果已经点赞则取消点赞
var interBlog blog.Blog
err = mysql.DB.Where("id=?", req).First(&interBlog).Error
if !errors.Is(err, nil) {
return nil, errors.New("博客不存在")
}
// 判断是否已经点赞
u := utils.GetUser(h.Context).GetID()
idStr := strconv.FormatInt(u, 10)
key := constants.BLOG_LIKED_KEY + *req
isLike, err := redis.IsLiked(h.Context, key, idStr)
if err != nil {
hlog.Debugf("like redis error: %+v", err)
return nil, err
}
fmt.Printf("isLike = %+v", isLike)
// 如果已经点赞则取消点赞
if isLike {
if !errors.Is(redis.RedisClient.ZRem(h.Context, key