关注接口实现总结|青训营笔记

104 阅读3分钟

关注接口实现总结|青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 11天

hertz+kitex实现用户关注服务

因为队友实现了用户信息服务,所以对于关注操作来说,我只需要实现关注关系就可以了

1.设计数据结构模型

关注操作,是一位用户对另一位用户的操作(包不包括自己本身可以自行决定),所以,两个字段,操作者id和被关注者id,同时不能重复关注操作,二者作为联合主键,同时两个字段应该都是外键,因为无论是操作者id还是被关注者id都应是用户表里的用户。数据结构代码如下:

type Follower struct {
    // UserId 关注了 FollowID
    UserId   int64 `gorm:"primaryKey" json:"userId"`
    FollowId int64 `gorm:"primaryKey" json:"followerId"`
}
type User struct {
    Followers     []Follower    `gorm:"foreignKey:user_id;foreignKey:follow_id"`
}

2.编写操作函数

User表数据结构自行根据需求设计,数据结构设计完成后应编写操作方法,关注操作对于数据库来说就是添加一段关系记录,所以在关系表中插入二者的id就可以了,注意的是顺序不要弄反,然后同时给用户表中关注操作者的关注人数+1,被关注者的粉丝人数+1,如果出现错误,应撤销所有操作,所以这里可以用到事务操作,Gorm自带的Transaction就可以,也可以选择当插入操作没有出现错误时,进行人数加的操作,取消关注同理

err := GormClient.Transaction(func(tx *gorm.DB) error {
        //tx.Create()
        // 1. 新增
        follow := model.Follower{
            UserId:   userId,
            FollowId: followId,
        }
        err := tx.Create(&follow).Error
        if err != nil {
            return err
        } else {
            // followID 的 follower + 1
            if err := tx.Model(&model.User{}).Where("uuid = ?", followId).
                Update("follower_count", gorm.Expr("follower_count + 1")).Error; err != nil {
                return err
            }
            // userId 的 follow + 1
            if err := tx.Model(&model.User{}).Where("uuid = ?", userId).
                Update("follow_count", gorm.Expr("follow_count + 1")).Error; err != nil {
                return err
            }
            return nil
        }
    })
    return err

3.编写IDL

考虑需要的参数以及返回值,根据需求编写IDL,在这里,关注操作需要的参数只有两个,操作者id和被关注者id,返回值也是一般基础的返回值,一个状态码,一个返回状态描述,编写之后,执行kitex命令,生成代码。

4.编写服务函数

因为关注操作比较简单,所以在服务目录下,新建usercenter结构体名下的方法Follow(userId, followId int64) error

// Follow 关注用户
func (uc UserCenter) Follow(userId, followId int64) error {
    return query.Follow(userId, followId)
}

然后在handler.go调用该函数

// Follow implements the UserCenterImpl interface.
func (s *UserCenterImpl) Follow(ctx context.Context, req *kitex_gen.FollowRequest) (resp *kitex_gen.BasicResponse, err error) {
    err = service.UserCenter{}.Follow(req.UserId, req.FollowId)
    if err != nil {
        resp = &kitex_gen.BasicResponse{
            StatusCode: 1,
            StatusMsg:  "follow failed err:" + err.Error(),
        }
        return
    }
    resp = &kitex_gen.BasicResponse{
        StatusCode: 0,
        StatusMsg:  "success",
    }
    return
}

注意返回状态也要加上

5.RPC调用服务

在rpc目录下编写调用服务的函数,功能比较简单,所以直接传参调用就可以

func Follow(userId, followId int64) error {
    req := kitex_gen.FollowRequest{
        UserId:   userId,
        FollowId: followId,
    }
    _, err := userClient.Follow(context.Background(), &req)
    return err
}

6.网关

在网关层编写操作rpc的函数,接受前端传过来的参数,然后根据请求进行对应的操作,解析参数,调用RPC层方法执行操作,注意返回状态码和状态描述

最后在路由层router.go文件注册地址,就ok了

新手小白,第一次写微服务,这些步骤也是自己在网上看视频和博客照葫芦画瓢做的,若有错误欢迎指正