Go实战 | 电商平台 用户注册

Posted 小生凡一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go实战 | 电商平台 用户注册相关的知识,希望对你有一定的参考价值。

用到的包

github.com/gin-contrib/sessions

github.com/gin-contrib/sessions/cookie

github.com/gin-gonic/gin

1. 编写路由

  • 新建一个WSGI应用程序实例。
	r := gin.Default()
  • 设置全局变量store
	store := cookie.NewStore([]byte("something-very-secret"))
  • 在路由中使用中间件调用store
	r.Use(sessions.Sessions("mysession", store))

2. 注册路由

  • 分一个基础路由组
v1 := r.Group("api/v1")
  • 在这个基础路由编写用户注册路由
v1 := r.Group("api/v1")

	//用户操作
	v1.POST("user/register", api.UserRegister)

3. 注册接口

3.1 service层

  • service先创建一个user.go

  • 再在service层上编写用户注册服务的结构体
//UserRegisterService 管理用户注册服务
type UserRegisterService struct 
	Nickname  string `form:"nickname" json:"nickname" binding:"required,min=2,max=10"`
	UserName  string `form:"user_name" json:"user_name" binding:"required,min=5,max=15"`
	Password  string `form:"password" json:"password" binding:"required,min=8,max=16"`

  • 在service上编写用户注册register方法
func (service *UserRegisterService) Register() 
	

3.2 api层

  • api层创建user.go

  • 申请一个 UserRegisterService用户注册服务对象。
var userRegisterService service.UserRegisterService

但是这个服务我们还没有写,先把这个接口写完,再把这个服务补上。

  • 上下文绑定数据
c.ShouldBind(&userRegisterService)
  • 调用这个服务的register方法
res := userRegisterService.Register()
  • 返回这个服务的处理结果
c.JSON(200, res)
  • api 层的用户注册服务全部代码
func UserRegister(c *gin.Context) 
	var userRegisterService service.UserRegisterService 
	//相当于创建了一个UserRegisterService对象
	if err := c.ShouldBind(&userRegisterService); err == nil 
		res := userRegisterService.Register()
		//调用这个对象中的Register方法。
		c.JSON(200, res)
	 else 
		c.JSON(200, ErrorResponse(err))
		logging.Info(err)
	

  • 创建一个common.go文件, 进行错误的返回

//返回错误信息 ErrorResponse
func ErrorResponse(err error) serializer.Response 
	if ve, ok := err.(validator.ValidationErrors); ok 
		for _, e := range ve 
			field := conf.T(fmt.Sprintf("Field.%s", e.Field))
			tag := conf.T(fmt.Sprintf("Tag.Valid.%s", e.Tag))
			return serializer.Response
				Status: 40001,
				Msg:    fmt.Sprintf("%s%s", field, tag),
				Error:  fmt.Sprint(err),
			
		
	
	if _, ok := err.(*json.UnmarshalTypeError); ok 
		return serializer.Response
			Status: 40001,
			Msg:    "JSON类型不匹配",
			Error:  fmt.Sprint(err),
		
	
	return serializer.Response
		Status: 40001,
		Msg:    "参数错误",
		Error:  fmt.Sprint(err),
	


3.2 serializer

  • 创建一个基础的序列化返回结构体
// Response 基础序列化器
type Response struct 
	Status int         `json:"status"`
	Data   interface `json:"data"`
	Msg    string      `json:"msg"`
	Error  string      `json:"error"`

4. 注册服务

接下来我们就可以编写register()注册服务了

  • 先对传过来的用户名进行验证,查看是否已经存在了
	model.DB.Model(&model.User).Where("user_name=?",service.UserName).Count(&count)
	if count == 1 
		code = e.ErrorExistUser
		return serializer.Response
			Status: code,
			Msg:    e.GetMsg(code),
		
	
  • 再对密码进行加密
	if err := user.SetPassword(service.Password); err != nil 
		logging.Info(err)
		code = e.ErrorFailEncryption
		return serializer.Response
			Status: code,
			Msg:    e.GetMsg(code),
		
	

注意: 我们可以直接再model/user.go下编写密码加密方法

const (
	PassWordCost        = 12         //密码加密难度
	Active       string = "active"   //激活用户
)

//SetPassword 设置密码
func (user *User) SetPassword(password string) error 
	bytes, err := bcrypt.GenerateFromPassword([]byte(password), PassWordCost)
	if err != nil 
		return err
	
	user.PasswordDigest = string(bytes)
	return nil

  • 确认无误之后对用户进行创建
	if err := model.DB.Create(&user).Error; err != nil 
		logging.Info(err)
		code = e.ErrorDatabase
		return serializer.Response
			Status: code,
			Msg:    e.GetMsg(code),
		
	

服务层中用户注册的完整代码

func (service *UserRegisterService) Register() serializer.Response 
	var user model.User
	var count int
	code := e.SUCCESS
	model.DB.Model(&model.User).Where("user_name=?",service.UserName).Count(&count)
	if count == 1 
		code = e.ErrorExistUser
		return serializer.Response
			Status: code,
			Msg:    e.GetMsg(code),
		
	
	user = model.User
		Nickname: service.Nickname,
		UserName: service.UserName,
		Status:   model.Active,
	
	//加密密码
	if err := user.SetPassword(service.Password); err != nil 
		logging.Info(err)
		code = e.ErrorFailEncryption
		return serializer.Response
			Status: code,
			Msg:    e.GetMsg(code),
		
	
	user.Avatar = "http://q1.qlogo.cn/g?b=qq&nk=294350394&s=640"
	//创建用户
	if err := model.DB.Create(&user).Error; err != nil 
		logging.Info(err)
		code = e.ErrorDatabase
		return serializer.Response
			Status: code,
			Msg:    e.GetMsg(code),
		
	
	return serializer.Response
		Status: code,
		Msg:    e.GetMsg(code),
	

下一章中,我们编写用户登录的业务逻辑。

以上是关于Go实战 | 电商平台 用户注册的主要内容,如果未能解决你的问题,请参考以下文章

Go实战 | 电商平台 用户信息修改

Go实战 | 电商平台 需求分析

Go实战 | 电商平台(11) 更新商品

Go实战 | 电商平台(12) 删除商品

Go实战 | 电商平台(10) 搜索商品

Go实战 | 电商平台 展示商品