基于go-gin的微信小程序api框架搭建

文章目录 基于go-gin的微信小程序api框架搭建1.为什么选gin2. 其他技术3. 代码模块4. 我曾经跨过的山和大海4.1 如何优雅地使用gorm4.1.1 中文编码问题4.1.2 gorm居然不支持MYSQL的JSON4.1.3 关于外键 4.2 鉴权4.3 优雅的api访问日志4.4 redis缓存 5.结语
废话不多说,先上github链接

1.为什么选gin Gin是一个 go web 框架,最大的优点就是高性能,比 http router 快 40 倍。轻量,使用起来方便简洁,支持路由分组。对中间件支持很好,方便用第三方中间件也可以自己定义,还能很方便地跟路由进行结合。学习成本低。
2. 其他技术

Redis

提供缓存支持,有利于提高数据交换速率。gin-contrib的中间件sessions对redis的支持保存session,记录用户状态,方便鉴权。

MySQL

后端开发成员有一定的使用经验。也是主流的数据库之一。go的ORM gorm对mysql的支持很不错,除了个别注意事项(4.1 如何优雅地使用gorm)。

Nginx

后台需要一定的安全保障,Nginx作为反向代理可以将服务端跟外界隔离开。Nginx 可以为多个服务端进行代理,可以代理部署在多个端口 go server,从而使得服务器有着较高的抗压能力。Nginx 较容易配置端口转发。网上教程很多,在此提供项目的配置文件供参考

weApp SDK
https://github.com/medivhzhan/weapp
涵盖了wx小程序的各种请求,调用起来方便清晰
“哟哟,这个轮子真是又大又圆”

3. 代码模块

先来看看文件树,再看看代码

.├── config # 用于读取配置文件config.json中的数据├── config.json ├── controllers # 对路由请求进行处理│ ├── ad│ ├── resource│ ├── task│ └── user├── database # 链接数据库├── main.go # 主程序├── middlewares # 自定义的中间件│ ├── auth# 用session进行鉴权│ ├── logger# 自定义访问日志中间件,对日志进行格式修改、打印、分割│ └── session# 注册gin-contrib/sessions 中间件├── models # 数据模型,对数据库进行访问│ ├── ad│ ├── campus│ ├── common│ ├── school│ ├── tag│ ├── task│ └── user├── modules # 自定义的模块│ ├── gredis# 调用redis进行缓存│ ├── log# 自定义日志,如错误日志│ └── util# 工具包,对一些常用的代码块进行封装├── router # 路由└── storage # 存储文件夹 ├── file# 文件存储 ├── img# 图片存储 └── logs# 日志存储 4. 我曾经跨过的山和大海

懒得写新的blog了,就放这了

4.1 如何优雅地使用gorm

附上文档,基本的CURD看完就可以上手了,简单易学,在此为大家排点雷。

4.1.1 中文编码问题

通过gorm建数据表时,设置编码,编码要是utf8mb4支持unicode,而不是utf8,

DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4").CreateTable(&TableName{}) 4.1.2 gorm居然不支持MYSQL的JSON

不管是go还是mysql,JSON的格式本质都是[]byte,既然如此,那就自己造一个JSON类型来用,参考内容

4.1.3 关于外键

gorm的外键关联是“软”关联,可以方便地用于创建、查询和修改,1对1、1对多、多对多都能很方便得完成,虽然我还是建了几个关系表。但是删除时却不会因为外键指向的数据项被删除而将该数据项删除

4.2 鉴权

新手上路,并没有使用高大上的JWT,而是用gin支持得很ok的sessions来进行。

登录成功后将用户信息存入session

session := sessions.Default(c)session.Set("userId", user.Id)err := session.Save()

response里会有cookie,cookie的内容是session_id,发送请求时请务必带上

鉴权中间件middlewares/auth.go

//router.go中设置路由//context的传递:router->authMiddleware->controlleruserGroup.DELETE("/session", auth.AuthMiddleware(), userController.Logout)func AuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {session := sessions.Default(c)userId := session.Get("userId")if userId == nil {c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"msg": "invalid session token",})c.Error(errors.New("invalid session token"))} else {id := userId.(string)users, _ := userModel.GetUsersByStrKey("id", id)if len(users) == 0 {c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"msg": "invalid session token",})c.Error(errors.New("invalid session token"))} else {c.Set("user", users[0])}c.Next()}}} 4.3 优雅的api访问日志

日志太丑了怎么办?用"github.com/sirupsen/logrus"来进行规范化
日志太多了怎么办?用"github.com/lestrrat-go/file-rotatelogs"来切割一下
代码还是比较通俗易懂的,中间件Logger
如何服用?

router := gin.Default()router.Use(logger.Logger()) 4.4 redis缓存

推荐一个靠谱的教程

5.结语

关于go-web的部分,看到这,整体的api框架已经有了,但是还有其他很重要的东西

微信小程序要求支持https,如何配置服务器看这篇教程就差不多了。补充两个注意点:域名注册完要记得申请域名解析,并不是申请了ssl证书就可以了; 记得要去进行网站备案,不然会被工信部封。docker的部署还是一个大坑,留个教程位给gitgiter大佬。