Write the Code. Change the World.

9月 09

获取图片验证码、登录、获取个人信息都好了。现在做注册功能。

在 ctrl 中调整好姿势。

internal/controller/user/user_admin_sign_up.go

package user

import (
    "context"

    "goSimpleAdmin/api/user/admin"
    model "goSimpleAdmin/internal/model/admin"
    "goSimpleAdmin/internal/service"
)

func (c *ControllerAdmin) SignUp(ctx context.Context, req *admin.SignUpReq) (res *admin.SignUpRes, err error) {
    data, err := service.User().SignUp(ctx, model.SignUpReq{
        Nickname:   req.Nickname,
        Account:    req.Account,
        Password:   req.Password,
        VerifyKey:  req.VerifyKey,
        VerifyCode: req.VerifyCode,
    })

    if err != nil {
        return
    }

    res = new(admin.SignUpRes)
    res.SignUpRes = data
    return res, err
}

在 logic 中完成业务。注册有点不一样,注册需要验证码。也就是第一步,先请求图片验证码。这个时候会返回一个验证码 id 回来。

注册的时候,这个 id 要带过去,并输入验证码信息以及注册的其他信息才可以。这里额外对账号进行了判断。如果账号是手机号码,就把手机号码也填充上,如果是邮箱也填充上。

正常途径下,手机和邮箱都需要收到验证码验证才会真正入库的。这里简化了。

func (s *sUser) SignUp(ctx context.Context, in model.SignUpReq) (res model.SignUpRes, err error) {
    verifyCode := in.VerifyCode
    verifyKey := in.VerifyKey
    match := captcha.NewCaptcha(ctx).VerifyCaptcha(verifyKey, verifyCode)

    if !match {
        err = gerror.New("验证码不正确或已过期")
        return
    }

    record, err := dao.User.Ctx(ctx).Where(do.User{
        Account: in.Account,
    }).WhereOr(do.User{
        Phone: in.Account,
    }).WhereOr(do.User{
        Email: in.Account,
    }).One()

    if err != nil {
        err = gerror.New("请稍后再试")
        return
    }

    if !record.IsEmpty() {
        err = gerror.New("账号已经存在")
        return
    }

    data := do.User{
        Account:  in.Account,
        Password: in.Password,
        Nickname: in.Nickname,
    }

    if utils.IsPhone(in.Account) {
        data.Phone = in.Account
    }

    if utils.IsEmail(in.Account) {
        data.Email = in.Account
    }

    lastInsertId, err := dao.User.Ctx(ctx).Data(data).InsertAndGetId()
    if err != nil {
        err = gerror.New("请稍后再试")
        return
    }

    var user *entity.User
    err = dao.User.Ctx(ctx).Where(do.User{
        Id: lastInsertId,
    }).Scan(&user)

    if err != nil {
        err = gerror.New("请稍后再试")
        return
    }

    if user == nil {
        err = gerror.New("请稍后再试")
        return
    }

    payloadData := g.Map{
        "id":       user.Id,
        "nickname": user.Nickname,
    }

    res.Token, res.Expire, err = jwt.NewJwt().TokenGenerator(payloadData)

    return res, err
}

调整好逻辑后,在 postman 中尝试一下。到最后返回 token 就是对的了。

不过,总觉得 ctrl 轻,logic 重。

这样,无论登录还是注册都返回一个 tokne。至于其他信息,让用户再去请求。

发表回复

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