|
@@ -15,6 +15,7 @@ import (
|
|
stringUtils "eta/eta_mini_ht_api/common/utils/string"
|
|
stringUtils "eta/eta_mini_ht_api/common/utils/string"
|
|
smsService "eta/eta_mini_ht_api/domian/sms"
|
|
smsService "eta/eta_mini_ht_api/domian/sms"
|
|
userService "eta/eta_mini_ht_api/domian/user"
|
|
userService "eta/eta_mini_ht_api/domian/user"
|
|
|
|
+ userDao "eta/eta_mini_ht_api/models/user"
|
|
"fmt"
|
|
"fmt"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm"
|
|
"strings"
|
|
"strings"
|
|
@@ -28,6 +29,10 @@ var (
|
|
redisCache *cache.RedisCache
|
|
redisCache *cache.RedisCache
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+const (
|
|
|
|
+ emptyPhoneNum = "-"
|
|
|
|
+)
|
|
|
|
+
|
|
func message() sms.SMSClient {
|
|
func message() sms.SMSClient {
|
|
if smsSender == nil {
|
|
if smsSender == nil {
|
|
smsSender = sms.GetInstance()
|
|
smsSender = sms.GetInstance()
|
|
@@ -126,97 +131,134 @@ type LoginDTO struct {
|
|
Mobile string
|
|
Mobile string
|
|
}
|
|
}
|
|
|
|
|
|
-func Login(login LoginDTO) (token string, err error) {
|
|
|
|
- var user userService.UserDTO
|
|
|
|
- user, err = userService.GetUserByMobile(login.Mobile)
|
|
|
|
|
|
+func Logout(userId int, openId string) (err error) {
|
|
|
|
+ //设置用户为登录状态
|
|
|
|
+ err = userService.UserLogout(userId)
|
|
if err != nil {
|
|
if err != nil {
|
|
- if !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
|
- err = exception.New(exception.UnknownError)
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- //注册用户
|
|
|
|
- var wechatInfo wechat.WxUser
|
|
|
|
- //微信请求异常
|
|
|
|
- wechatInfo, err = wx().Login(login.Code)
|
|
|
|
- //微信客户端的异常不做处理,已经是EtaError
|
|
|
|
- if err != nil {
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- user = initUser(wechatInfo, login)
|
|
|
|
- err = userService.RegisterTemplateUser(&user)
|
|
|
|
- if err != nil {
|
|
|
|
- err = exception.New(exception.TemplateUserCreateFailed)
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
|
|
+ logger.Error("用户退出登录失败:%v", err)
|
|
|
|
+ err = exception.New(exception.LogoutFailed)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ _ = userService.UserLogoutFlow(userId)
|
|
|
|
+ err = rd().Delete(redis.GenerateTokenKey(openId))
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = rd().SetString(redis.GenerateTokenKey(openId), "", 1)
|
|
|
|
+ }
|
|
|
|
+ if err != nil {
|
|
|
|
+ logger.Error("用户退出登录失败:%v", err)
|
|
|
|
+ err = exception.New(exception.LogoutFailed)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+func Login(userId int, openId, mobile, verifyCode string) (token string, err error) {
|
|
|
|
+ //设置用户为登录状态
|
|
|
|
+ err = userService.UserLogin(userId)
|
|
|
|
+ if err != nil {
|
|
|
|
+ logger.Error("用户登录失败:%v", err)
|
|
|
|
+ err = exception.New(exception.GenerateTokenFailed)
|
|
|
|
+ return
|
|
}
|
|
}
|
|
- token, err = jwt.CreateToken(user.OpenId, user.Mobile)
|
|
|
|
|
|
+ _ = userService.UserLoginFlow(userId)
|
|
|
|
+ token, err = jwt.CreateToken(openId, mobile, jwt.AccessToken)
|
|
if err != nil {
|
|
if err != nil {
|
|
err = exception.New(exception.GenerateTokenFailed)
|
|
err = exception.New(exception.GenerateTokenFailed)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- err = rd().SetString(redis.GenerateTokenKey(user.Mobile), token, 90*24*60*60)
|
|
|
|
|
|
+ //保险先删一下
|
|
|
|
+ _ = rd().Delete(redis.GenerateTokenKey(openId))
|
|
|
|
+ err = rd().SetString(redis.GenerateTokenKey(openId), token, 90*24*60*60)
|
|
if err != nil {
|
|
if err != nil {
|
|
err = exception.New(exception.GenerateTokenFailed)
|
|
err = exception.New(exception.GenerateTokenFailed)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ //清除手机验证码
|
|
codeDTO := smsService.CodeDTO{
|
|
codeDTO := smsService.CodeDTO{
|
|
- Mobile: login.Mobile,
|
|
|
|
- Code: login.VerifyCode,
|
|
|
|
|
|
+ Mobile: mobile,
|
|
|
|
+ Code: verifyCode,
|
|
}
|
|
}
|
|
//登录成功删除短信验证码,数据库留痕
|
|
//登录成功删除短信验证码,数据库留痕
|
|
- err = rd().Delete(redis.GenerateSmsKey(login.Mobile))
|
|
|
|
|
|
+ err = rd().Delete(redis.GenerateSmsKey(mobile))
|
|
if err != nil {
|
|
if err != nil {
|
|
logger.Error("清除redis 短信验证码失败,%v", err)
|
|
logger.Error("清除redis 短信验证码失败,%v", err)
|
|
- _ = rd().SetString(redis.GenerateSmsKey(login.Mobile), "", 1)
|
|
|
|
- return "", err
|
|
|
|
|
|
+ err = rd().SetString(redis.GenerateSmsKey(mobile), "", 1)
|
|
|
|
+ return
|
|
}
|
|
}
|
|
_ = smsService.TryVerifiedCode(codeDTO)
|
|
_ = smsService.TryVerifiedCode(codeDTO)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
-func BindMobile(userId int, mobile, verifyCode string) (err error) {
|
|
|
|
|
|
+func BindMobile(userId int, mobile string) (err error) {
|
|
err = userService.BindUserMobile(userId, mobile)
|
|
err = userService.BindUserMobile(userId, mobile)
|
|
if err != nil {
|
|
if err != nil {
|
|
err = exception.New(exception.BindMobileFailed)
|
|
err = exception.New(exception.BindMobileFailed)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- codeDTO := smsService.CodeDTO{
|
|
|
|
- Mobile: mobile,
|
|
|
|
- Code: verifyCode,
|
|
|
|
- }
|
|
|
|
- //登录成功删除短信验证码,数据库留痕
|
|
|
|
- err = rd().Delete(redis.GenerateSmsKey(mobile))
|
|
|
|
- if err != nil {
|
|
|
|
- logger.Error("清除redis 短信验证码失败,%v", err)
|
|
|
|
- _ = rd().SetString(redis.GenerateSmsKey(mobile), "", 1)
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- _ = smsService.TryVerifiedCode(codeDTO)
|
|
|
|
|
|
+
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
-func RefreshToken(code string) (token string, isBindMobile int, err error) {
|
|
|
|
|
|
+func RefreshToken(code string) (token string, isBindMobile int, status string, tokenType string, err error) {
|
|
//注册用户
|
|
//注册用户
|
|
var wechatInfo wechat.WxUser
|
|
var wechatInfo wechat.WxUser
|
|
//微信请求异常
|
|
//微信请求异常
|
|
wechatInfo, err = wx().Login(code)
|
|
wechatInfo, err = wx().Login(code)
|
|
//微信客户端的异常不做处理,已经是EtaError
|
|
//微信客户端的异常不做处理,已经是EtaError
|
|
if err != nil {
|
|
if err != nil {
|
|
- fmt.Println("wx.Login,err:" + err.Error())
|
|
|
|
|
|
+ logger.Error("获取微信用户信息失败,错误信息:%v", err)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
user, err := userService.GetTemplateUserByOpenId(wechatInfo.OpenId)
|
|
user, err := userService.GetTemplateUserByOpenId(wechatInfo.OpenId)
|
|
- var isAdd bool
|
|
|
|
- if err != nil {
|
|
|
|
- if err == gorm.ErrRecordNotFound {
|
|
|
|
- isAdd = true
|
|
|
|
|
|
+ if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
|
+ err = exception.New(exception.TemplateUserFoundFailed)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ //用户记录不存在则返回unbind
|
|
|
|
+ //未注册/未绑定
|
|
|
|
+ var mobile string
|
|
|
|
+ if errors.Is(err, gorm.ErrRecordNotFound) || user.Mobile == "" {
|
|
|
|
+ status = string(userService.UnBind)
|
|
|
|
+ tokenType = jwt.GuestToken
|
|
|
|
+ isBindMobile = 0
|
|
|
|
+ mobile = emptyPhoneNum
|
|
|
|
+ } else {
|
|
|
|
+ isBindMobile = 1
|
|
|
|
+ //已绑定(登出)
|
|
|
|
+ if user.LoginStatus == userDao.Logout {
|
|
|
|
+ tokenType = jwt.GuestToken
|
|
|
|
+ mobile = emptyPhoneNum
|
|
|
|
+ status = string(userService.Logout)
|
|
} else {
|
|
} else {
|
|
- err = exception.New(exception.TemplateUserNotFound)
|
|
|
|
|
|
+ //已绑定(登录)
|
|
|
|
+ tokenType = jwt.AccessToken
|
|
|
|
+ mobile = user.Mobile
|
|
|
|
+ status = string(userService.Login)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //通过unionId 查询用户是否已注册,存在是因为先发生了公众号的关注,所以只需要绑定小程序openId就行
|
|
|
|
+ wxUser, err := userService.GetTemplateUserByUnionId(wechatInfo.UnionId)
|
|
|
|
+ if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
|
+ err = exception.New(exception.TemplateUserFoundFailed)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
|
+ user.OpenId = wechatInfo.OpenId
|
|
|
|
+ user.UnionId = wechatInfo.UnionId
|
|
|
|
+ err = userService.RegisterTemplateUser(&user)
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = exception.New(exception.TemplateUserCreateFailed)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ } else { //修改微信小程序openid
|
|
|
|
+ err = userService.BindUserXcxOpenId(wxUser.Id, user.OpenId)
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = exception.New(exception.TemplateUserBindFailed)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- token, err = jwt.CreateToken(wechatInfo.OpenId, wechatInfo.OpenId)
|
|
|
|
|
|
+ token, err = jwt.CreateToken(wechatInfo.OpenId, mobile, tokenType)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ logger.Error("生成token失败:%v", err)
|
|
err = exception.New(exception.GenerateTokenFailed)
|
|
err = exception.New(exception.GenerateTokenFailed)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
@@ -225,32 +267,6 @@ func RefreshToken(code string) (token string, isBindMobile int, err error) {
|
|
err = exception.New(exception.GenerateTokenFailed)
|
|
err = exception.New(exception.GenerateTokenFailed)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- if user.Mobile == "" {
|
|
|
|
- isBindMobile = 0
|
|
|
|
- } else {
|
|
|
|
- isBindMobile = 1
|
|
|
|
- }
|
|
|
|
- if isAdd {
|
|
|
|
- user.OpenId = wechatInfo.OpenId
|
|
|
|
- user.UnionId = wechatInfo.UnionId
|
|
|
|
- var isRegister bool
|
|
|
|
-
|
|
|
|
- //判断unionid是否存在
|
|
|
|
- wxUser, unionErr := userService.GetTemplateUserByUnionId(wechatInfo.UnionId)
|
|
|
|
- if unionErr != nil {
|
|
|
|
- if unionErr == gorm.ErrRecordNotFound { //注册用户
|
|
|
|
- isRegister = true
|
|
|
|
- } else {
|
|
|
|
- err = exception.New(exception.TemplateUserNotFound)
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if isRegister {
|
|
|
|
- err = userService.RegisterTemplateUser(&user)
|
|
|
|
- } else { //修改微信小程序openid
|
|
|
|
- err = userService.BindUserXcxOpenId(wxUser.Id, user.OpenId)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|