第015节:用户名密码登录功能开发

功能介绍

上节课已经完成了验证码的生成,本节课来开发用户名、密码和验证码登录功能。

接口和参数解析定义

用户名和密码的登录接口为:

/api/login_pwd

接口请求类型为POST,接口参数有三个:name,pwd,captcha。其中:captcha为验证码。

定义登录参数结构体LoginParam:

//用户名,密码和验证码登录
type LoginParam struct {
    Name     string                json:"name" //用户名
    Password string                json:"pwd"  //密码
    Id       string                json:"id"// captchaId 验证码ID
    Value    string                json:"value" //验证码
}

逻辑控制层实现登录流程控制

方法解析

在MemberController.go文件中,编写方法用于处理用户名密码登录的解析方法如下所示:

func (mc *MemberController) Router(engine *gin.Engine){
    engine.POST("/api/login_pwd", mc.nameLogin)
}

登录流程编程实现

定义新的func并命名为nameLogin,实现登录流程逻辑控制:

//用户名、密码登录
func (mc *MemberController) nameLogin(context *gin.Context) {

    //1、登录参数解析
    var loginParam param.LoginParam

    err := toolbox.Decode(context.Request.Body, &loginParam)
    if err != nil {
        toolbox.Failed(context, "参数解析失败")
        return
    }

    //2、验证验证码
    service := impl.NewMemberService()
    validate := toolbox.CaptchaVerify(loginParam.Id, loginParam.Value)
    fmt.Println(validate)
    if !validate {
        toolbox.ValidateFailed(context, "验证码不正确, 请重新验证 ")
        return
    }

    //3、登录
    member := service.Login(loginParam.Name, loginParam.Password)
    if member.Id == 0 {
        toolbox.Failed(context, "登录失败")
        return
    }
    toolbox.Success(context, &member)
}

在控制层的nameLogin方法中,主要有3个逻辑处理:

  • 1、通过*gin.Context解析请求登录请求携带的参数。

  • 2、从携带的参数中得到提交的验证码数据,调用验证码判断验证码方法对验证码进行判断。验证码验证失败或者验证码失效,直接返回登录失败信息。

  • 3、使用用户名、密码参数进行登录,判断登录结果。如果登录成功,返回用户登录信息,否则返回登录失败。

Service层实现

在功能服务层的MemberService文件中,定义和实现用户名密码登录的Login方法。详细实现如下:

//用户登录: 如果没有登录过,自动进行登录
func (msi *MemberServiceImpl) Login(name string, password string) *model.Member {

    dao := impl.NewMemberDao()

    //1、先查询是否已经存在该用户
    member := dao.Query(name, password)
    if member.Id != 0 {
        return member
    }

    user := model.Member{}
    user.UserName = name
    user.Password = toolbox.EncoderSha256(password)
    user.RegisterTime = time.Now().Unix()

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

在service层的Login方法中,分为两步逻辑判断:

  • 1、先查询是否已经存在该用户,如果该用于已经存在,则直接将查询到的用户信息返回。

  • 2、如果用户不存在,将用户信息作为新记录保存到数据库中,新增一条记录。并返回用户信息。

最后,涉及到操作数据库的两个方法分别是:Query和InsertMember方法。InsertMember方法之前已经编写过,只需要重新编写一个Query方法即可,Query方法实现如下所示:

//根据用户名和密码查询用户记录
func (mdi *MemberDaoImpl) Query(name string, password string) *model.Member {
    var member model.Member

    password = toolbox.EncoderSha256(password)

    _, err := mdi.Where(" user_name = ? and password = ? ", name, password).Get(&member)
    if err != nil {
        toolbox.Error(err.Error())
        return nil
    }

    return &member
}

功能测试

开发完成的功能可以通过Postman和前端程序进行调试。

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

发表评论

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

联系我们

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

QR code