一、项目介绍
最近一段时间零零散散学了点golang,在寻找学习资料的时候偶然发现这个项目,感觉还挺好用,代码结构和组织也蛮规范,强迫症狂喜,并且实现了用户注册、登录、登出、查看信息等接口。当然,这个项目更大的意义是:可以以此为基础快速搭建Restful Web API,链接附上:github.com/gourouting/…
clone代码后,首先观察go.mod,在我的理解中,这个文件类似于java中的pom文件,能够看出项目中用到了哪些技术栈:
module singo
go 1.16
require (
github.com/gin-contrib/cors v1.3.1
github.com/gin-contrib/sessions v0.0.3
github.com/gin-gonic/gin v1.7.1
github.com/go-redis/redis v6.15.9+incompatible
github.com/joho/godotenv v1.3.0
github.com/onsi/gomega v1.12.0 // indirect
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a
gopkg.in/go-playground/validator.v8 v8.18.2
gopkg.in/yaml.v2 v2.4.0
gorm.io/driver/mysql v1.1.0
gorm.io/gorm v1.21.10
)
不难发现,里面包含了如gin、gorm、go-redis、godotenv等较为主流的框架,所以在此基础上进行二次开发会相对容易些。下面对项目的整体架构说一下个人的理解:
api:类似于java中的controller层。main.go存放着一些基础接口,user.go存放着对于user的操作接口,作者已经实现了四个,分别是/user/login、/user/register、/user/me、/user/logout,其中,/user/me和/user/logout需要获取用户登录后的session。
auth:权限控制的文件夹。目前这个.keep文件是空的,可能暂时没用,我也没有过多了解。
cache:初始化redis链接操作。
conf:类似于java中的config。/locales和i18n是一些国际化文件,对于个人开发来说属于屎盆子镶金边,没啥用;conf.go里面有一个Init()函数,可以从.env文件中读取数据库的ip、账号、密码等配置信息并连接,还包含一些对日志的设置操作。
middleware:中间件,类似于java中的拦截器。cors.go和session.go分别是跨域配置和session设置,不用了解含义,直接CV;auth.go就是一些鉴权操作,例如/user/me需要用户登陆后才能查看自己的个人信息,/user/logout需要用户登陆后才能登出,这个文件就存放着这种类似鉴定用户是否登录的操作。
model:类似于java中的pojo/entity,存放着对于数据库的映射实体类。init.go是对于数据库的连接操作,供conf.go调用;user.go定义了用户模型,和数据库中的users表做映射,类似java中的string userName string password等;migration.go是数据迁移操作,例如你创建了一个名为singo的数据库,但是里面没有创建tabel,如果在migration.go中设置对user的数据迁移,项目启动后就会自动在你的singo数据库中创建users表,并配置好你在user.go中定义的各个字段类型。
serializer:序列化器,类似于java中的vo,即后端返回给前端的字段。common.go存放着一些基础的序列化操作,如统一结果返回类型,统一错误返回类型等;user.go就是userVO,定义了后端传递给前端的字段。
server:规定了中间件和路由的设置。中间件的设置:例如项目启动后就调用session和cros中间件,实现session和跨域配置;路由的设置:例如用户以POST方法访问"/user/register"路径,则会调用api中的UserRegister方法。
service:类似于java中service的impl,统一处理逻辑,但和java不同的是,里面每个service中都定义了它们对应的vo。例如user_register_service,用户注册时需要填写的信息大概有userName,nickName,password、passwordConfirm,这里就针对这个定义了UserRegister类,下面写了具体的注册方法;对于user_login_service,用户登录时只需要填写userName和password,所以这里面的UserLogin类只包含这两个字段,下面对应着具体的登陆方法。
util:类似于java中的util,存放着一些通用的工具方法。
.env:类似于java中的application.yml,写着mysql、redis等的地址、端口、账号、密码,供conf中的Init()读取并配置。
main.go:类似于java中的SpringBootApplication,项目的启动程序。经过以上的结构分层以后,启动程序就非常的简洁且优雅了,代码如下:
func main() {
// 从配置文件读取配置
conf.Init()
// 装载路由
r := server.NewRouter()
r.Run(":3000")
}
二、后续工作
想按照作者的教程所说,以此项目为基础进行二次开发,做一个仿照bilibili的视频网站,当然功能肯定要相对少很多。作者给的教程也大致看了一下,功能实现的没有那么完善,我不太满意,但是又没有能力把它搞好,所以只能在github上找一找有没有大佬做好的现成的仿bilibili项目,然后或许可以研究一下怎么部署到我的服务器,开个子域名解析到哪个端口上,做一个自己的视频播放网站?
但是捏,里面涉及到很多技术细节,包括但不限于上传文件到阿里云OSS,还想在用户注册时开个验证码功能,最重要的是前端还得自己写,md一个人干全栈,有待商榷!