243 lines
5.0 KiB
Go

package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"hepa-calc-api/api/dao"
"hepa-calc-api/api/dto"
"hepa-calc-api/api/model"
"hepa-calc-api/api/requests"
"hepa-calc-api/api/responses"
"hepa-calc-api/api/service"
"hepa-calc-api/config"
"hepa-calc-api/extend/weChat"
"hepa-calc-api/global"
"hepa-calc-api/utils"
"time"
)
type Login struct{}
// LoginPhone 手机号登录
func (r *Login) LoginPhone(c *gin.Context) {
loginRequest := requests.LoginRequest{}
req := loginRequest.LoginPhone
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 检测验证码
if config.C.Env != "dev" {
code, _ := global.Redis.Get(c, "login_code_count_"+req.Mobile).Result()
if code == "" {
responses.FailWithMessage("验证码失效", c)
return
}
if req.Code != code {
responses.FailWithMessage("验证码错误", c)
return
}
}
// 检测用户信息
userDao := dao.UserDao{}
maps := make(map[string]interface{})
maps["mobile"] = req.Mobile
user, _ := userDao.GetUser(maps)
// 新用户处理方式
if user == nil {
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
fmt.Println(r)
tx.Rollback()
}
}()
// 头像
avatar := "www.baidu.com"
// 登录ip
publicService := service.PublicService{}
loginIp := publicService.GetUserIP(c.Request)
// 新增用户
user = &model.User{
UserName: "",
Mobile: req.Mobile,
RegisterSource: req.Source,
OpenId: "",
UnionId: "",
Age: nil,
Sex: 0,
Avatar: avatar,
IsMember: 0,
MemberExpireDate: nil,
LoginIp: loginIp,
}
loginAt := model.LocalTime(time.Now())
user.LoginAt = &loginAt
user, err := userDao.AddUser(tx, user)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
fmt.Println(user)
// 获取app用户信息
//var result *string
//if result == nil {
// // 新增app用户信息
//}
tx.Commit()
}
// 下发token
token := &utils.Token{
UserId: fmt.Sprintf("%d", user.UserId),
}
// 生成jwt
jwt, err := token.NewJWT()
if err != nil || jwt == "" {
responses.FailWithMessage("登陆失败", c)
return
}
// 处理返回值
g := dto.LoginMobileDto(user)
// 加载token
g.LoadToken(jwt)
responses.OkWithData(g, c)
}
// LoginWx 微信授权登录
func (r *Login) LoginWx(c *gin.Context) {
loginRequest := requests.LoginRequest{}
req := loginRequest.LoginWx
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 获取微信网页授权access_token
webAccessToken, err := weChat.GetWebAccessToken(req.Code)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 网页授权拉取用户信息
userInfo, err := weChat.GetUserInfo(webAccessToken.AccessToken, webAccessToken.OpenId)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
fmt.Println(userInfo)
// 检测用户信息
userDao := dao.UserDao{}
maps := make(map[string]interface{})
maps["open_id"] = webAccessToken.OpenId
user, _ := userDao.GetUser(maps)
// 新用户处理方式
if user == nil {
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
fmt.Println(r)
tx.Rollback()
}
}()
// 处理用户头像
userService := service.UserService{}
avatar, err := userService.HandleUserAvatar(userInfo.HeadImgUrl)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 登录ip
publicService := service.PublicService{}
loginIp := publicService.GetUserIP(c.Request)
// 新增用户
user = &model.User{
UserName: userInfo.Nickname,
Mobile: "",
RegisterSource: req.Source,
OpenId: userInfo.OpenId,
UnionId: userInfo.UnionId,
Age: nil,
Sex: userInfo.Sex,
Avatar: avatar,
IsMember: 0,
MemberExpireDate: nil,
LoginIp: loginIp,
}
loginAt := model.LocalTime(time.Now())
user.LoginAt = &loginAt
user, err = userDao.AddUser(tx, user)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 获取app用户信息
//var result *string
//if result == nil {
// // 新增app用户信息
//}
tx.Commit()
}
// 下发token
token := &utils.Token{
UserId: fmt.Sprintf("%d", user.UserId),
}
// 生成jwt
jwt, err := token.NewJWT()
if err != nil || jwt == "" {
responses.FailWithMessage("登陆失败", c)
return
}
// 处理返回值
g := dto.LoginWxDto(user)
// 加载token
g.LoadToken(jwt)
responses.OkWithData(g, c)
}