129 lines
4.0 KiB
Go

/*
* @desc:用户登录
* @company:云南奇讯科技有限公司
* @Author: yixiaohu<yxh669@qq.com>
* @Date: 2023/2/24 11:39
*/
package controller
import (
"context"
"errors"
"fmt"
"github.com/ArtisanCloud/PowerWeChat/v3/src/miniProgram/auth/response"
resp "github.com/ArtisanCloud/PowerWeChat/v3/src/miniProgram/phoneNumber/response"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/util/gconv"
"github.com/tiger1103/gfast/v3/api/v1/wechat"
systemModel "github.com/tiger1103/gfast/v3/internal/app/system/model"
systemService "github.com/tiger1103/gfast/v3/internal/app/system/service"
"github.com/tiger1103/gfast/v3/internal/app/wechat/service"
"github.com/tiger1103/gfast/v3/library/libUtils"
"github.com/tiger1103/gfast/v3/library/liberr"
)
var Login = new(loginController)
type loginController struct {
BaseController
}
func (c *loginController) WxUrl(ctx context.Context, req *wechat.WxUrlReq) (res *wechat.WxUrlRes, err error) {
res = new(wechat.WxUrlRes)
res.Url, err = service.Wechat().GetWxUrl(ctx)
return
}
func (c *loginController) WxLogin(ctx context.Context, req *wechat.WxLoginReq) (res *wechat.WxLoginRes, err error) {
var (
data *response.ResponseCode2Session
phoneData *resp.ResponseGetUserPhoneNumber
user *systemModel.LoginUserRes
token string
)
data, err = service.Wechat().Session(ctx, req.Code)
if err != nil {
return
}
if data.ResponseMiniProgram.ErrCode != 0 {
err = gerror.New(fmt.Sprintf("errCode: %d , errMsg: %s", data.ResponseMiniProgram.ErrCode, data.ResponseMiniProgram.ErrMsg))
return
}
phoneData, err = service.Wechat().GetUserPhoneNumber(ctx, req.PhoneCode)
if err != nil {
return
}
if phoneData.ErrCode != 0 {
err = gerror.New(fmt.Sprintf("errCode: %d , errMsg: %s", phoneData.ErrCode, phoneData.ErrMsg))
return
}
user, token, err = c.doLogin(ctx, phoneData.PhoneInfo.PhoneNumber, data.OpenID)
if err != nil {
return
}
res = &wechat.WxLoginRes{
UserInfo: user,
Token: token,
}
return
}
func (c *loginController) doLogin(ctx context.Context, phone, openId string) (user *systemModel.LoginUserRes, token string, err error) {
err = g.Try(ctx, func(ctx context.Context) {
ip := libUtils.GetClientIp(ctx)
userAgent := libUtils.GetUserAgent(ctx)
err = g.Try(ctx, func(ctx context.Context) {
//警员服务器未获取到,从本地获取
user, err = systemService.SysUser().GetUserByPhone(ctx, phone)
liberr.ErrIsNil(ctx, err)
if user == nil {
// 保存登录失败的日志信息
systemService.SysLoginLog().Invoke(gctx.New(), &systemModel.LoginLogParams{
Status: 0,
Username: phone,
Ip: ip,
UserAgent: userAgent,
Msg: "用户不存在",
Module: "微信小程序",
})
return
}
err = systemService.SysUser().UpdateLoginInfo(ctx, user.Id, ip, openId)
liberr.ErrIsNil(ctx, err)
})
if user == nil {
liberr.ErrIsNil(ctx, errors.New("用户不存在"))
}
// 报存登录成功的日志信息
systemService.SysLoginLog().Invoke(gctx.New(), &systemModel.LoginLogParams{
Status: 1,
Username: user.Mobile,
Ip: ip,
UserAgent: userAgent,
Msg: "登录成功",
Module: "微信小程序",
})
key := gconv.String(user.Id) + "-" + gmd5.MustEncryptString(gconv.String(user.Id)) + gmd5.MustEncryptString(user.Mobile)
if g.Cfg("wechat").MustGet(ctx, "gfToken.multiLogin").Bool() {
key = gconv.String(user.Id) + "-" + gmd5.MustEncryptString(gconv.String(user.Id)) + gmd5.MustEncryptString(user.Mobile+ip+userAgent)
}
user.UserPassword = ""
user.UserSalt = ""
token, err = service.GfToken().GenerateToken(ctx, key, user)
liberr.ErrIsNil(ctx, err, "登录失败,后端服务出现错误")
//用户在线状态保存
systemService.SysUserOnline().Invoke(gctx.New(), &systemModel.SysUserOnlineParams{
UserAgent: userAgent,
Uuid: gmd5.MustEncrypt(token),
Token: token,
Username: user.UserNickname,
Ip: ip,
})
})
return
}