获取图片验证码、登录、获取个人信息都好了。现在做注册功能。
在 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。至于其他信息,让用户再去请求。