(十三)手机号发送短信验证码
开始前的准备
编码开始
接受前端数据
app/requests/signup_request.go
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849type SignupUsingPhoneRequest struct { Phone string `json:"phone,omitempty" valid:"phone"` VerifyCode string `json:"verify_code,omitempty" valid:"verify_code"` Name string `valid:"name" json:"name"` Password string `valid:"password" json:" ...
(十二)用邮件来发送验证码
开始前的准备
12$ go install github.com/mailhog/MailHog@latest$ go get github.com/jordan-wright/email
我们用mailhog来作为邮箱服务器
SMTP端口:1025
网页端口:8025
我们再powershell使用MailHog命令开启服务
编码
封装mail包
我们依然先去封装mail包
pkg/mail/driver_interface.go
12345package mailtype Driver interface { Send(mail Email, config map[string]string) bool}
pkg/mail/driver_smtp.go
123456789101112131415161718192021222324252627282930313233343536373839404142434445package mailimport ( "fmt" emailPKG "github.com/jo ...
(十一)利用阿里云平台发送短信
开始前的准备
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 ...