第011-012节:用户数据表创建及插入数据

功能和背景介绍

在项目的登录功能中,如果在登录时发现用户名和密码在用户表中不存在,会自动将用户名和密码保存在用户表中,创建一个新的用户。

因此,除了使用手机号和验证码登录以外,还支持使用用户名、密码进行登录。

如果首次使用手机号和验证码进行登录,会默认将手机号作为用户名创建新的用户,将用户结构体对象的数据保存在数据库中。

因此,我们有必要创建用户表。

用户数据结构体定义

在项目中,使用结构体定义用户数据结构。结构体定义如下所示:

type Member struct {
    Id           int64   xorm:"pk autoincr" json:"id"
    UserName     string  xorm:"varchar(20)" json:"user_name"
    Mobile       string  xorm:"varchar(11)" json:"mobile"
    Password     string  xorm:"varchar(255)" json:"password"
    RegisterTime int64   xorm:"bigint" json:"register_time"
    Avatar       string  xorm:"varchar(255)" json:"avatar"
    Balance      float64 xorm:"double" json:"balance"
    IsActive     int8    xorm:"tinyint" json:"is_active"
    City         string  xorm:"varchar(10)" json:"city"
}

通过定义Member结构体,表示应用的用户信息。通过TAG中的xorm来指定结构体在数据库表中的约束。

ORM映射

通过engine.Sync2方法将Member同步映射成为数据库中的member表:

...
err = engine.Sync2(new(model.Member),
        new(model.SmsCode))
if err != nil {
    return nil,err
}
...

插入数据

当用户获取完验证码,并填写验证码以后,用户点击登录,会发起登录请求。因此,我们需要来完成登录相关的逻辑操作和处理。用户手机号码和验证码登录的接口是api/login_sms,因此我们在已经创建的MemberController中解析短信验证码接口。如下所示:

func (mc *MemberController) Router(engine *gin.Engine) {
    ...
    //发送手机验证码
    engine.GET("/api/sendcode", mc.sendSmsCode)
    //手机号和短信登录
    engine.OPTIONS("/api/login_sms", mc.smsLogin)
}

在MemberController中创建smsLogin方法完成用户手机号和密码登录的逻辑,详细实现如下:

//短信登录
func (mc *MemberController) smsLogin(context *gin.Context) {

    var smsParam param.SmsLoginParam
    err := toolbox.Decode(context.Request.Body, &smsParam)

    fmt.Println(err.Error())

    fmt.Println(context.PostForm("phone"))
    fmt.Println(context.Query("code"))
    if err != nil {
        toolbox.Failed(context, "参数解析错误")
        return
    }

    us := service.NewMemberService()
    member := us.SmsLogin(smsParam)
    if member != nil {
        toolbox.Success(context, member)
        return
    }
    toolbox.Failed(context, "登录失败")
}

用户服务层

在MemberService.go文件中,编写SmsLogin方法完成手机号和密码登录。

func (msi *MemberService) SmsLogin(param param.SmsLoginParam) *model.Member {

    dao := dao.NewMemberDao()
    sms := dao.ValidateSmsCode(param.Phone, param.Code)

    if sms == nil || time.Now().Unix()-sms.CreateTime > 300 {
        return nil
    }

    member := dao.QueryByPhone(param.Phone)
    if member != nil {
        return member
    }

    user := model.Member{}
    user.UserName = param.Phone
    user.Mobile = param.Phone
    user.RegisterTime = time.Now().Unix()

    user.Id = dao.InsertMember(user)
    return &user
}

在MemberService中,首先验证手机号和验证码是否正确。如果通过了手机号和验证码的验证,通过手机号查询用户是否已经存在。如果用户记录不存在,则创建新的用户记录并保存到数据库中,如果用户记录已经存在,则表示登录成功,返回用户信息。

数据库操作的MemberDao实现如下

在MemberDao中,实现用户模块的数据库操作。
首先是手机验证码验证功能,如下所示:

func (md *MemberDao) ValidateSmsCode(phone string, code string) *model.SmsCode {
    var sms model.SmsCode

    if err := md.Where(" phone = ? and code = ? ", phone, code).Find(&sms); err != nil {
        toolbox.Error(err.Error())
    }
    return &sms
}

其次是根据手机号查询用户数据库表中是否存在手机号对应的用户,如下所示:

func (md *MemberDao) QueryByPhone(phone string) *model.Member {
    var member model.Member

    if err := md.Where(" phone = ? ", phone).Find(&member); err != nil {
        toolbox.Error(err.Error())
    }
    return &member
}

最后,对于新手机号,新建用户,插入到数据库中:

func (md *MemberDao) InsertMember(member model.Member) int64 {
    result, err := md.InsertOne(&member)
    if err != nil {
        toolbox.Error(err.Error())
    }
    return result
}

至此,我们使用手机号和验证码的登录方式就开发完成了。

原创文章,Golang中国出品,文章对应源码下载:https://www.qfgolang.com/?page_id=1973

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

学习交流群:点击这里给我发消息

QR code