(十五)密码加密和jwt认证
 开始前的准备
12$ go get golang.org/x/crypto$ go get github.com/golang-jwt/jwt
 开始编码
 密码加密
pkg/hash/hash.go
12345678910111213141516171819202122package hashimport (   "go-api-practice/pkg/logger"   "golang.org/x/crypto/bcrypt")func BcryptHash(password string) string {   bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)   logger.LogIf(err)   return string(bytes)}func BcryptCheck(password, hash string) bool {   err := bcrypt.CompareHashAndPassword([]byte(h ...
(十四)邮箱发送验证码
 开始前的准备
发送邮箱验证码时请确保开启MailHog
 开始编码
整体逻辑和手机发送短信差不多
 接受前端数据
app/requests/signup_request.go
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152type SignupUsingEmailRequest struct {   Email           string `json:"email,omitempty" valid:"email"`   VerifyCode      string `json:"verify_code,omitempty" valid:"verify_code"`   Name            string `valid:"name" json:"name"`   Password        s ...
(十三)手机号发送短信验证码
 开始前的准备
 编码开始
 接受前端数据
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 ...
