GO语言笔记服务项目(4)|青训营笔记

196 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

在第六次课中来自字节跳动的老师为我们耐心讲解了一个用go语言实现的笔记服务demo,在课后我尝试自己复现了一遍这个demo进行学习,这里简要记录一下学习经验与心得体会。

书接上回,我们讲到了构建笔记服务项目,今天继续看其它的知识。

构建代码模板

在写好接口文件后,我们在项目主目录下使用命令

go mod init mynote

以初始化go mod。然后再使用命令

kitex -module mynote -type protobuf -service user idl/user.proto

以生成相关代码。此时,会多出kitex_gen文件夹、script文件夹、build.sh、handler.go、main.go,将除了kitex_gen文件夹之外的文件都移入cmd/user文件夹下。

note服务同理,使用命令

kitex -module mynote -service note idl/note.thrift

然后将生成的文件移入cmd/note中。

完善业务逻辑

通过kitex生成的代码模板中有大量todo需要我们完善业务逻辑,这里以cmd/user/handler.go中的CreateUser为例:

func (s *UserServiceImpl) CreateUser(ctx context.Context, req *userdemo.CreateUserRequest) (resp *userdemo.CreateUserResponse, err error) {
    resp = new(userdemo.CreateUserResponse)
​
    if len(req.UserName) == 0 || len(req.Password) == 0 {
        resp.BaseResp = pack.BuildBaseResp(errno.ParamErr)
        return resp, nil
    }
​
    err = service.NewCreateUserService(ctx).CreateUser(req)
    if err != nil {
        resp.BaseResp = pack.BuildBaseResp(err)
        return resp, nil
    }
    resp.BaseResp = pack.BuildBaseResp(errno.Success)
    return resp, nil
}

首先通过resp = new(userdemo.CreateUserResponse)创建响应,并在最后打包resp.BaseResp = pack.BuildBaseResp(errno.Success)并返回return resp, nil

中间是我们需要具体完善的业务逻辑,首先检查用户名与密码是否有效,然后调用service.NewCreateUserService(ctx).CreateUser(req)进行进一步的操作。这里我们自然的需要在user下创建文件夹service,并创建文件create_user.go以具体处理注册逻辑。

type CreateUserService struct {
    ctx context.Context
}
​
// NewCreateUserService new CreateUserService
func NewCreateUserService(ctx context.Context) *CreateUserService {
    return &CreateUserService{ctx: ctx}
}
​
// CreateUser create user info.
func (s *CreateUserService) CreateUser(req *userdemo.CreateUserRequest) error {
    users, err := db.QueryUser(s.ctx, req.UserName)
    if err != nil {
        return err
    }
    if len(users) != 0 { // user已存在
        return errno.UserAlreadyExistErr
    }
​
    h := md5.New()
    if _, err = io.WriteString(h, req.Password); err != nil {
        return err
    }
    passWord := fmt.Sprintf("%x", h.Sum(nil))
    return db.CreateUser(s.ctx, []*db.User{{
        UserName: req.UserName,
        Password: passWord,
    }})
}

这当中又需要对数据库进行操作,需要调用db.QueryUserdb.CreateUser方法,因此我们进一步在dal层完善数据库操作逻辑...以此类推即可。

在完善剩余的业务逻辑后,我们的笔记服务就构建完成了!

参考文档