错误定义

定义错误码和输出,在utils下,新建一个文件夹errmsg,注意,文件夹!在文件夹下再新建errmsg.go,为什么要这样做呢,因为在同一个文件夹下,只能允许存在一个package,我们在utils下,只能使用utils,所以,新建一个errmsg,我们就可以使用errmsg这个包名。

package errmsg

// 定义一些常量,用来指定错误码。
const (
	SUCCSE = 200
	ERROR  = 500

	// code=1XXX,用户模块错误
	ERROR_USERNAME_USED = 1001
	ERROR_PASSWORD_WRONG = 1002
	ERROR_USER_NOT_EXIST = 1003
	ERROR_TOKEN_EXIST = 1004
	ERROR_TOKEN_RUNTIME = 1005
	ERROR_TOKEN_WRONG = 1006
	ERROR_TOKEN_TYPE_WRONG = 1007

	// code=2XXX,文章模块错误

	// code=3XXX,分类模块错误
)

// 定义一个map,用来接收状态码来输入错误信息
var CodeMsg = map[int]string{
	SUCCSE:                 "OK",
	ERROR:                  "FAIL",
	ERROR_USERNAME_USED:    "用户名已存在!",
	ERROR_PASSWORD_WRONG:   "密码错误",
	ERROR_USER_NOT_EXIST:   "用户不存在",
	ERROR_TOKEN_EXIST:      "TOKEN不存在,请重新登陆",
	ERROR_TOKEN_RUNTIME:    "TOKEN已过期,请重新登陆",
	ERROR_TOKEN_WRONG:      "TOKEN不正确,请重新登陆",
	ERROR_TOKEN_TYPE_WRONG: "TOKEN格式错误,请重新登陆",
}

// 定义一个方法,来接收状态吗输出错误信息
func GetErrorMsg(code int)string  {
	return CodeMsg[code]
}

用户create/get

写业务逻辑接口,每个人都有每个人的习惯,这里我按照我的习惯写一下,这部分如果熟悉gorm的使用或者有其他想法的道友就可以跳过啦。

不过注意,此时的用户添加注册不是最终形态,因为最起码的密码还没有加密,所以后期还需要慢慢的来补。暂时先如此。

  1. 首先在model/User.go下,新添加几个操作数据库函数,这里只针对于数据库的GORM操作,并不关API的事。
// 存在性判断
func CheckUser(name string)(code int) {
	var users User
	// 查询用户是否存在
	db.Where("username=?",name).First(users)
	if users.ID > 0 {
		// 如果存在则引出错误
		return errmsg.ERROR_USERNAME_USED
	}
	// 不存在则输入正确
	return errmsg.SUCCSE
}

// 添加用户
func CreateUser(data *User)int  {
	// 添加时接收一下错误
	err := db.Create(&data).Error
	if err!=nil {
		return errmsg.ERROR
	}
	return errmsg.SUCCSE
}

// 用户列表
func GetUsers(PageSize int, PageNum int)[]User  {
	var users []User
	// 分页
	err = db.Limit(PageSize).Offset((PageNum - 1) * PageSize).Find(&users).Error
	if err != nil && err != gorm.ErrRecordNotFound {
		return nil
	}
	// 返回用户的列表
	return users
}
  1. api/v1/user.go下,添加API代码:
var code int

// 添加用户
func AddUser(c *gin.Context)  {
  // 接收用户数据,放在data里
	var data model.User
	_ = c.ShouldBindJSON(&data)
  // 查看是否存在,不存在则添加
	code = model.CheckUser(data.Username)
	if code == errmsg.SUCCSE {
		model.CreateUser(&data)
	}
  // 如果存在,则返回错误码
	if code == errmsg.ERROR_USERNAME_USED {
		code = errmsg.ERROR_USERNAME_USED
	}

	c.JSON(http.StatusOK,gin.H{
		"code":code,
		"msg":errmsg.GetErrorMsg(code),
		"data":data,
	})
}

// 查询多个用户
func GetUsers(c *gin.Context)  {
	// 字符串转int,如果不传,默认值按照需求设置
	PageSize,_ := strconv.Atoi(c.DefaultQuery("pagesize","3"))
	PageNum,_ := strconv.Atoi(c.DefaultQuery("pagenum","1"))

	data := model.GetUsers(PageSize,PageNum)
	code = errmsg.SUCCSE
	c.JSON(http.StatusOK,gin.H{
		"code":code,
		"msg":errmsg.GetErrorMsg(code),
		"data":data,
	})

}

有个小问题,如果用户存在,且状态码返回了,但是返回的同时有他输入的数据,还有User这个结构体的数据结构,很不安全,掌握了接口之后,有心之人很可能会通过篡改数据等方法威胁到数据库安全。暂时先这样,还得研究一下。