基于GO的即时聊天后端项目(三)用户表设计与实现

在完成项目初始化后,我们开始来实现用户模块的API。
第一步是设计用户表并实现用户表的CRUD

用户表需求分析

在聊天系统中,用户表的设计如下:

用户名

密码

头像

性别

电话号码

邮件

标识

登录设备 ip 

登录设备 端口

盐值     //用于加密时添加的随机字符串,提升密文复杂性

登录时间

离线时间

心跳时间

是否在线

登录设备描述

用户表声明

在 /models/user_basic.go 下声明用户表:

import (
	"gorm.io/gorm"
	"time"
)

// UserBasic Basic User model
type UserBasic struct {
	gorm.Model
	Name          string
	PassWord      string
	Avatar        string // profile photo
	Gender        string `gorm:"column:gender;default:male;type:varchar(6);comment:'value in {male, female}'"`
	Phone         string `valid:"matches(^1[3-9]{1}\\d{9}$)"`
	Email         string `valid:"email"`
	Identity      string
	ClientIp      string `valid:"ipv4"`
	ClientPort    string
	Salt          string
	LoginTime     *time.Time `gorm:"column:login_time"`
	HeartBeatTime *time.Time `gorm:"column:heart_beat_time"`
	LoginOutTime  *time.Time `gorm:"column:login_out_time"`
	IsLoginOut    bool
	DeviceInfo    string // the login in device
}

// UserTableName return the name of User Table
func (b *UserBasic) UserTableName() string {
	return "user_basic"
}

推荐阅读gorm官方文档:模型声明以获取更多信息

用户表生成

我们使用 gorm 库根据上一步定义好的 User_basic 结构体自动生成用户表

在 /test/main.go中:

  • 连接数据库
  • 创建用户表
func main() {
	// declare the connection to the DB
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		config.User, config.Password, config.Host, config.Port, config.DBName)
	// connect to the Database
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	// create the user_basic table
	err = db.AutoMigrate(&models.UserBasic{})
	if err != nil {
		panic(err)
	}
}

GORM的crud

具体详细信息可查阅gorm官方文档:gorm官方文档
下面演示了一些常用命令:

/* 查询 */
var users *[]User
var user User
// 1. 获取所有记录
tx := db.Where("gender = ?", gender).Find(&users)
// 2. 获取特定记录 
tx := db.Where("id = ?", id).First(&user)
// 3. 处理错误
if tx.RowsAffected == 0 {
    return error
}

/* 新增 */
tx := db.Create(&user)

/* 修改 */
tx := db.Model(&user).Update(&User{
    Name:   user.Name,
    Pwd:    user.Pwd,
    ···
})

/* 删除 */
tx := db.Delete(&user)

用户表 crud

  • 功能模块
    • 查询
      • 用户列表
      • 用户名 + 密码查询
      • 根据用户名查询用户
      • 根据 id 查询用户
      • 根据电话查询用户
      • 根据邮件查询用户
    • 新增
      • 新建用户
    • 更新
      • 更新用户
    • 删除
      • 删除用户
  • 在 dao 文件夹下新建一个 user.go 存储所有对 user_basics 数据表的操作
// 此处以获取用户名为例,展示如何在代码中使用 gorm 进行 CRUD 操作:
// GetUserByNameAndPwd Query User by name and pwd, Used in verify when Login in
func GetUserByNameAndPwd(name string, pwd string) (*models.UserBasic, error) {
	var user models.UserBasic
	if tx := global.DB.Where("name = ? and pass_word = ?", name, pwd).First(&user); tx.RowsAffected == 0 {
		return nil, errors.New("query User by name and pwd Failed")
	}

	// Login in Identify
	curTime := strconv.Itoa(int(time.Now().UnixNano()))
	md5time := common.Md5Encoder(curTime)
	if tx := global.DB.Model(&user).Where("id = ?", user.ID).Update("identity", md5time); tx.RowsAffected == 0 {
		return nil, errors.New("update Identity Failed")
	}

	return &user, nil
}
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值