小众点评黑马点评项目Go语言实现--Hertz+Redis练手项目

小众点评黑马点评项目Go语言实现--Hertz+Redis练手项目

文章目录

一、项目详情

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

📌 相关推荐