从4开始,在后端系统中增加用户注册和登录功能(上)

306 阅读2分钟

本次我们接着上四篇文章进行讲解《从0开始,用Go语言搭建一个简单的后端业务系统》《从1开始,扩展Go语言后端业务系统的RPC功能》《从2开始,在Go语言后端业务系统中引入缓存》以及《从3开始,在业务系统中增加分页功能》,这次是系统中比较核心的功能——用户登录&注册,这个功能其实本应该是最先实现的,但是由于不同因素的影响,放到了本次进行实现,不过也无伤大雅,后期我们都会不断的进行查漏补缺和优化来使我们的项目总体上更加优雅,话不多说,我们开始正文:

1 用户注册&登录流程

(1)注册流程 在这里插入图片描述 (2)登录流程 在这里插入图片描述

2 代码实现

user结构:

package model

import (
   "encoding/json"
)

type User struct {
   Id         int64  `json:"id"`
   Name       string `json:"name"`
   LoginName  string `json:"login_name"`
   Role       int64  `json:"role"`
   Pwd        string `json:"pwd"`
   CreateTime string `json:"create_time"`
}

func (user User) TableName() string {
   return "user_info"
}

func (user User) MarshalJSON() ([]byte, error) {
   return json.Marshal(map[string]interface{}{
      "id":          user.Id,
      "name":        user.Name,
      "login_name":  user.LoginName,
      "role":        user.Role,
      "pwd":         user.Pwd,
      "create_time": user.CreateTime,
   })
}

//Redis类似序列化操作
func (user User) MarshalBinary() ([]byte, error) {
   return json.Marshal(user)
}

func (user User) UnmarshalBinary(data []byte) error {
   return json.Unmarshal(data, &user)
}

dao层代码:

package dao

import (
   "context"
   "count_num/pkg/model"
)

type UserDao interface {
   // 添加一个
   CreateUser(ctx context.Context, user model.User) bool
   // 根据ID查找一个
   GetUserByUid(ctx context.Context, uId int64) model.User
   // 查找全部
   GetAll(ctx context.Context, page int, limit int) []model.User
   // 根据ID修改一个
   UpdateUserById(ctx context.Context, user model.User) bool
   // 根据登录名查找一个
   GetUserByLoginName(ctx context.Context, loginName string) model.User
}

dao层实现:

package impl

import (
   "context"
   "count_num/pkg/cache"
   "count_num/pkg/config"
   "count_num/pkg/model"
   "count_num/pkg/utils"
   "gorm.io/gorm"
)

type UserDaoImpl struct {
   db    *gorm.DB
   cache *cache.CountNumCacheDAOImpl
}

func NewUserDaoImpl() *UserDaoImpl {
   return &UserDaoImpl{db: config.DB, cache: cache.NewCountNumCacheDAOImpl()}
}

func (impl *UserDaoImpl) CreateUser(ctx context.Context, user model.User) bool {
   var u model.User
   impl.db.First(&u, "login_name", user.LoginName)
   if u.LoginName == user.LoginName {
      return false
   }
   user.Pwd = utils.GetMd5Str(user.Pwd)
   user.CreateTime = utils.NowTimeStr()
   impl.db.Save(&user)
   return true
}

func (impl *UserDaoImpl) GetUserByUid(ctx context.Context, uId int64) model.User {
   var user model.User
   impl.db.First(&user, "id", uId)
   return user
}

func (impl *UserDaoImpl) GetAll(ctx context.Context, page int, limit int) []model.User {
   users := make([]model.User, 0)
   if page <= 0 || limit <= 0 {
      impl.db.Find(&users)
   } else {
      impl.db.Limit(limit).Offset((page - 1) * limit).Find(&users)
   }
   return users
}

func (impl *UserDaoImpl) UpdateUserById(ctx context.Context, user model.User) bool {
   impl.db.Model(&model.User{}).Where("id = ?", user.Id).Updates(user)
   return true
}

func (impl *UserDaoImpl) GetUserByLoginName(ctx context.Context, loginName string) model.User {
   var user model.User
   impl.db.First(&user, "login_name", loginName)
   return user
}