(十一)利用阿里云平台发送短信
开始前的准备
12$ go get github.com/KenmyZhang/aliyun-communicate# 此外我们还需要在阿里云申请短信服务并且获取accesskey ID和accesskey secret
开始编码
封装sms
pkg/sms/driver_interface.go
12345package smstype Driver interface { Send(phone string, message Message, config map[string]string) bool}
pkg/sms/driver_aliyun.go
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package smsimport ( "encoding/json" aliyunsmsclient "github.com/KenmyZhang/aliyun-com ...
(十)统一返回格式
新建response包封装返回内容
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798package responseimport ( "github.com/gin-gonic/gin" "go-api-practice/pkg/logger" "gorm.io/gorm" "net/http")func JSON(c *gin.Context, data interface{}) { c.JSON(http.StatusOK, data)}func Success(c *gin.Context) { JSON( ...
(九)使用redis和captcha
开始前的准备
12$ go get github.com/go-redis/redis/v8$ go get github.com/mojocn/base64Captcha
开始编码
redis包
pkg/redis/redis.go
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134package redisimport ( "context" "github.com/go-redis/redis/v8" ...
(八)在gin和gorm中使用zap
开始前的准备
gin整合zap
还记得我们在gin中自定义中间件的函数吗,我们将自定义中间件并整合zap来代替原来的中间件
bootstrap/route.go
123456func registerGlobalMiddleware(router *gin.Engine) { router.Use( middlewares.Recovery(), middlewares.Logger(), )}
接下来的内容涉及到的内容很多,只需要理解大概即可,所以这一部分的讲解只会介绍大概的思路。
logger中间件
app/http/middlewares/logger.go
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576package middlewaresimport ( "bytes&q ...
(七)集成zap
开始前的准备
12$ go get go.uber.org/zap$ go get gopkg.in/natefinch/lumberjack.v2
这一部分内容我们需要上面两个包的内容,zap是一个功能强大而且完善的日志包,lumberjack则是一个日志分割的包。
这一部分的内容由于较到了较为全面的个性化配置,所以新内容会比较多,难度上会稍大,但是慢慢来,我们尽可能地梳理这里面的内容😏
开始编码
配置文件
配置的方法与前面的方法类似
config/log.go
1234567891011121314151617181920212223242526272829303132func init() { config.Add("log", func() map[string]interface{} { return map[string]interface{}{ // 日志级别,必须是以下这些选项: // "debug" —— ...
(六)封装验证器
开始前的准备
抽离公共部分代码
抽离验证函数中的公共部分
我们发现再验证手机号码和邮箱的过程中很多代码是类似的,所以我们可以把它们抽离出来重复使用
app/requests/signup_request.go
12345678910// 配置初始化opts := govalidator.Options{ Data: data, Rules: rules, TagIdentifier: "valid", // 模型中的 Struct 标签标识符 Messages: messages,}// 开始验证return govalidator.New(opts).ValidateStruct()
我们发现这个部分是完全一致的
app/requests/requests.go
123456789func validate(data interface{}, rules govalidator.MapData, messages govalidator.MapData) ma ...
(五)完成验证手机和邮箱是否存在接口
开始前的准备
1$ go get github.com/thedevsaddam/govalidator
简单好用的go验证包,可以自定义验证规则和错误信息
创建controller
app/http/controllers/api/v1/base_api_controller.go
12type BaseController struct {}
和前面一样,先创建一个Controller基类
app/http/controllers/api/v1/auth/signup_controller.go
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465type SignupController struct { v1.BaseController}func (sc *SignupController) IsPhoneExist(c *gin.Conte ...
(四)集成gorm
开始前的准备
12$ go get gorm.io/gorm$ go get gorm.io/driver/mysql
我们将使用gorm来使用数据库,项目中我们使用mysql数据库
集成gorm
配置信息
config/database.go
1234567891011121314151617181920212223242526func init() { config.Add("database", func() map[string]interface{} { return map[string]interface{}{ // 默认数据库 "connection": config.Env("DB_CONNECTION", "mysql"), "mysql": map[string]interface{}{ // 数据库连接信息 "host&qu ...
(三)集成viper
开始前的准备
viper
1$ go get github.com/spf13/viper
viper是一个相当常用的配置管理包,功能相当强大。但是如果之前没有接触过这个包,第一次学习可能感到疑惑,你可以根据自己的情况去先学习viper的用法或者保持一定的疑惑。
cast
1$ go get github.com/spf13/cast
一个非常方便的类型转换包
编码
编写viper工具包
pkg/config/config.go
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990package configimport ( "github.com/spf13/cast" viperlib "github.com/spf13/viper" ...
(二)集成gin
开始前的准备
gin
go get github.com/gin-gonic/gin
编码
构建main函数
main.go
1234567891011121314151617package mainimport ( "fmt" "github.com/gin-gonic/gin")func main() { router := gin.New() bootstrap.SetupRoute(router) err := router.Run(":3000") if err != nil { fmt.Println(err) }}
我们会在bootstrap包中的SetupRoute()中初始化router,下面我们去完成这个函数
初始化router
bootstrap/route.go
1234567891011121314151617181920212223242526272829package bootstrapimport ( ...