gin博客项目复盘--03错误处理、数据验证

简介: 错误码标准化,接口返回错误代码,以供前端使用查看。

错误处理

错误码标准化,接口返回错误代码,以供前端使用查看。

创建 /utils/errmsg/errmsg.go

package errmsg
const (
  SUCCSE = 200
  ERROR  = 500
  // code= 1000... 用户模块的错误
  ERROR_USERNAME_USED    = 1001
  ERROR_PASSWORD_WRONG   = 1002
  //...
)
var codemsg = map[int]string{
  SUCCSE: "ok",
  ERROR: "FAIL",
  ERROR_USERNAME_USED:    "用户名已存在!",
  ERROR_PASSWORD_WRONG:   "密码错误",
  //...
}
func GetErrMsg(code int) string {
  return codemsg[code]
}
复制代码

使用

model/Article.go

image.png

api/v1/article.go

image.png

接口

  1. 创建各个模块的路由接口

image.png

  1. 维护到路由中

image.png

编写用户接口,实现初步验证+分页功能

以查询用户列表为例

api/v1/user.go

//查询用户列表
func GetUsers(c *gin.Context) {
  pageSize, _ := strconv.Atoi(c.Query("pagesize"))
  pageNum, _ := strconv.Atoi(c.Query("pagenum"))
  username := c.Query("username")
  switch {
  case pageSize >= 100:
    pageSize = 100
  case pageSize <= 0:
    pageSize = 10
  }
  if pageNum == 0 {
    pageNum = 1
  }
  data, total := model.GetUsers(username, pageSize, pageNum)
  code := errmsg.SUCCSE
  c.JSON(
    http.StatusOK, gin.H{
      "status":  code,
      "data":    data,
      "total":   total,
      "message": errmsg.GetErrMsg(code),
    },
  )
}
复制代码

model/User.go

//GetUsers 查询用户列表
func GetUsers(username string, pageSize, pageNum int) ([]User, int64) {
  var users []User
  var total int64
  if username != "" {
    db.Select("id,username,role,created_at").Where(
      "username LIKE ?", username+"%",
    ).Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users)
    db.Model(&users).Where(
      "username LIKE ?", username+"%",
    ).Count(&total)
    return users, total
  }
  db.Select("id,username,role,created_at").Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users)
  db.Model(&users).Count(&total)
  return users, total
}
复制代码

后端数据验证

  • 使用 gin 框架内置包 validator
  • "github.com/go-playground/validator/v10"
  1. 在模型中的struct 加上数据验证的tag :validate

例如 model/Uesr.go 中:

type User struct {
  gorm.Model
  Username string `gorm:"type:varchar(20);not null " json:"username" validate:"required,min=4,max=12" label:"用户名"`
  Password string `gorm:"type:varchar(500);not null" json:"password" validate:"required,min=6,max=120" label:"密码"`
  Role     int    `gorm:"type:int;DEFAULT:2" json:"role" validate:"required,gte=2" label:"角色码"`
}
复制代码
  1. 新建 utils/validator/validator.go
package validator
import (
  "fmt"
  "ginVue3blog/utils/errmsg"
  //注意需要引入如下4个包
  "github.com/go-playground/locales/zh_Hans_CN" //中文包
  unTrans "github.com/go-playground/universal-translator" //翻译包
  "github.com/go-playground/validator/v10"
  zhTrans "github.com/go-playground/validator/v10/translations/zh"
  "reflect"
)
func Validate(data interface{}) (string, int) {
  validate := validator.New()
  uni := unTrans.New(zh_Hans_CN.New())
  trans, _ := uni.GetTranslator("zh_Hans_CN")
  err := zhTrans.RegisterDefaultTranslations(validate, trans)
  if err != nil {
    fmt.Println("err:", err)
  }
  validate.RegisterTagNameFunc(func(field reflect.StructField) string {
    label := field.Tag.Get("label")
    return label
  })
  err = validate.Struct(data)
  if err != nil {
    for _, v := range err.(validator.ValidationErrors) {
      return v.Translate(trans), errmsg.ERROR
    }
  }
  return "", errmsg.ERROR
}
复制代码
  1. api/user.go 使用验证

image.png

相关文章
|
JSON 缓存 前端开发
基于Axios二次封装请求库,带你重构面试亮点(一)
基于Axios二次封装请求库,带你重构面试亮点
102 0
|
缓存 JSON Java
那些年,我们写过的无效单元测试
在这篇文章里,作者通过日常的单元测试实践,系统地总结出一套避免编写无效单元测试用例的方法和原则。
405 12
那些年,我们写过的无效单元测试
|
测试技术 Linux Go
后端实践--单元测试与性能优化 青训营
后端实践--单元测试与性能优化 青训营
|
缓存 API
基于Axios二次封装请求库,带你重构面试亮点(二)
基于Axios二次封装请求库,带你重构面试亮点
67 0
|
SQL JSON 机器人
pytest+yaml设计接口自动化框架过程记录(一步一步记录如何设计,完结撒花),源码提供,视频教程
pytest+yaml设计接口自动化框架过程记录(一步一步记录如何设计,完结撒花),源码提供,视频教程
|
Web App开发 JavaScript
源码方法论:读vue3源码时遇到问题,我该如何验证?
源码方法论:读vue3源码时遇到问题,我该如何验证?
116 0
Yii2如何进行代码质量检查?底层原理是什么?
Yii2如何进行代码质量检查?底层原理是什么?
111 0
|
数据可视化
Yii2如何进行代码审查?具体怎么做?底层原理是什么?
Yii2如何进行代码审查?具体怎么做?底层原理是什么?
104 0
|
前端开发
#yyds干货盘点 【React工作记录十九】IE校验问题
#yyds干货盘点 【React工作记录十九】IE校验问题
76 0