学习Hertz 和 Gorm的结合,极简版抖音项目完成第一个注册接口 | 青训营

60 阅读3分钟

前言

今天学习了一下在Hertz中加入gorm,一开始以为可能有什么特殊的手法,结果研究了一下官方文档好像就是简单的加入就可以了,大项目作业的第一接口是一个视频流,但是为了学习,我先实现了最简单的注册接口,也就是用到了gorm的创建和查询功能。本篇文章很大程度上参考了官方样例Hertz_gorm

观察

git下来官方的样例后,可以发现和之前hz搭建的脚手架是差不多的,最大的区别就是多了这些东西:

image.png

dal下其实存的就是mysql有关的东西,dal/mysql/init就是初始化数据库连接,也就是gorm的那个open dsn的操作,这个不会的先去了解一下gorm。然后user.go就是数据库层面的操作,怎么说可以理解成Springboot的那个Service层吧。/dal/init.go就是简单的调用一下init.go,猜测是为了其他包调用更方便把,不是很明白为什么要封装一层。

以及在model文件夹下多了这些:

image.png

这个user.sql文件我推测只是用来让读者明白表结构的,有没有在项目里都无所谓,user.go文件就是熟悉的带着gorm.model的结构体了。

我们可以自己另外创建一个项目,把表用gorm自动创建出来,自己去写还容易犯错不是:

package main  
  
import (  
"gorm.io/driver/mysql"  
"gorm.io/gorm"  
"gorm.io/gorm/logger"  
"log"  
)  
  
type User struct {  
gorm.Model  
Id int64 // 用户id  
Name string // 用户名称  
Passwd string //用户密码  
FollowCount int64 // 关注总数  
FollowerCount int64 // 粉丝总数  
IsFollow bool // true-已关注,false-未关注  
Avatar string //用户头像  
BackgroundImage string //用户个人页顶部大图  
Signature string //个人简介  
TotalFavorited int64 //获赞数量  
WorkCount int64 //作品数量  
FavoriteCount int64 //点赞数量  
}  
  
var dsn = "root:aaa24331277@tcp(localhost:3306)/tiktok?charset=utf8&parseTime=True&loc=Local"  
  
var DB *gorm.DB  
  
func main() {  
var err error  
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{  
SkipDefaultTransaction: true,  
PrepareStmt: true,  
Logger: logger.Default.LogMode(logger.Info),  
})  
if err != nil {  
panic(err)  
}  
err = DB.AutoMigrate(User{})  
if err != nil {  
log.Println("表迁移失败")  
return  
}  
  
DB.Create(&User{  
Name: "gorsonpy",  
Passwd: "ggb",  
})  
}

有个细节,包里面的代码是不会自动执行的,也就是说我们的程序不会主动的去init好我们的数据库连接,那要咋办呢,很简单,在main函数里面调用init就可以了。

func main() {  
dal.Init()  
h := server.Default()  
register(h)  
h.Spin()  
}

也就是dal.Init。

然后就是很简单的搬砖环节了,我们今天就简单实现一个注册环节,它只需要一个user结构体,然后实现数据库查询和添加就可以了,很简单。 首先仿照之前的操作,我们根据IDL文件创建出脚手架:

syntax = "proto3";  
package user;  
  
import "api.proto";  
  
message douyin_user_register_request {  
string username = 1; // 注册用户名,最长32个字符  
string password = 2; // 密码,最长32个字符  
}  
  
message douyin_user_register_response {  
int32 status_code = 1; // 状态码,0-成功,其他值-失败  
optional string status_msg = 2; // 返回状态描述  
int64 user_id = 3; // 用户id  
string token = 4; // 用户鉴权token  
}  
  
service registerService{  
rpc registerMethod(douyin_user_register_request) returns(douyin_user_register_response){  
option (api.post) = '/douyin/user/register';  
}  
}

然后去修改handler里面的逻辑,注册的逻辑很简单就不放代码了防止代码文字比太高。