在完成项目初始化后,我们开始来实现用户模块的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
}