修正了登录

This commit is contained in:
wucongxing8150 2024-08-19 17:17:40 +08:00
parent d41f2399ad
commit 85b01f9002
7 changed files with 190 additions and 181 deletions

View File

@ -17,10 +17,10 @@ import (
type Login struct{} type Login struct{}
// LoginPhone 手机号登录 // Login 登录
func (r *Login) LoginPhone(c *gin.Context) { func (r *Login) Login(c *gin.Context) {
loginRequest := requests.LoginRequest{} loginRequest := requests.LoginRequest{}
req := loginRequest.LoginPhone req := loginRequest.Login
if err := c.ShouldBind(&req); err != nil { if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c) responses.FailWithMessage(err.Error(), c)
return return
@ -32,20 +32,6 @@ func (r *Login) LoginPhone(c *gin.Context) {
return 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
}
}
// 开始事务 // 开始事务
tx := global.Db.Begin() tx := global.Db.Begin()
defer func() { defer func() {
@ -65,21 +51,44 @@ func (r *Login) LoginPhone(c *gin.Context) {
user, _ := userDao.GetUser(maps) user, _ := userDao.GetUser(maps)
// 新用户处理方式 // 新用户处理方式
if user == nil { if user == nil {
// 检测验证码
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
}
}
// 登录ip // 登录ip
publicService := service.PublicService{} publicService := service.PublicService{}
loginIp := publicService.GetUserIP(c.Request) loginIp := publicService.GetUserIP(c.Request)
// 处理用户头像
userService := service.UserService{}
avatarOssPath, err := userService.HandleUserImage(req.HeadImgUrl)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 新增用户 // 新增用户
user = &model.User{ user = &model.User{
UserName: "", UserName: req.Nickname,
AppIden: "", AppIden: "",
Mobile: req.Mobile, Mobile: req.Mobile,
RegisterSource: req.Source, RegisterSource: req.Source,
OpenId: "", OpenId: req.OpenId,
UnionId: "", UnionId: req.UnionId,
Age: nil, Age: nil,
Sex: nil, Sex: nil,
Avatar: "", Avatar: avatarOssPath,
IsMember: 0, IsMember: 0,
MemberExpireDate: nil, MemberExpireDate: nil,
LoginIp: loginIp, LoginIp: loginIp,
@ -130,7 +139,7 @@ func (r *Login) LoginPhone(c *gin.Context) {
// 处理app用户数据 // 处理app用户数据
userService := service.UserService{} userService := service.UserService{}
err = userService.HandleAppUserInfo(tx, user, userInfo) err = userService.GetAppUserInfo(tx, user, userInfo)
if err != nil { if err != nil {
tx.Rollback() tx.Rollback()
responses.FailWithMessage(err.Error(), c) responses.FailWithMessage(err.Error(), c)
@ -138,7 +147,7 @@ func (r *Login) LoginPhone(c *gin.Context) {
} }
// 处理app用户病例数据 // 处理app用户病例数据
err = userService.HandleAppUserCase(tx, user) err = userService.GetAppUserCase(tx, user)
if err != nil { if err != nil {
tx.Rollback() tx.Rollback()
responses.FailWithMessage(err.Error(), c) responses.FailWithMessage(err.Error(), c)
@ -167,140 +176,3 @@ func (r *Login) LoginPhone(c *gin.Context) {
responses.OkWithData(g, c) 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
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
fmt.Println(r)
tx.Rollback()
}
}()
var userInfo *model.UserInfo
var err error
// 检测用户信息
userDao := dao.UserDao{}
maps := make(map[string]interface{})
maps["mobile"] = req.Mobile
user, _ := userDao.GetUser(maps)
// 新用户处理方式
if user == nil {
// 登录ip
publicService := service.PublicService{}
loginIp := publicService.GetUserIP(c.Request)
// 处理用户头像
userService := service.UserService{}
avatarOssPath, err := userService.HandleUserImage(req.HeadImgUrl)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 新增用户
user = &model.User{
UserName: "",
AppIden: "",
Mobile: req.Mobile,
RegisterSource: 2,
OpenId: req.OpenId,
UnionId: req.UnionId,
Age: nil,
Sex: nil,
Avatar: avatarOssPath,
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
}
// 新增用户详情
userInfo = &model.UserInfo{
UserId: user.UserId,
Height: "",
Weight: "",
NationId: nil,
IsFamilyHistory: nil,
IsPregnant: nil,
ExpectedDate: nil,
ProvinceId: nil,
Province: "",
CityId: nil,
City: "",
CountyId: nil,
County: "",
}
userInfoDao := dao.UserInfoDao{}
userInfo, err = userInfoDao.AddUserInfo(tx, userInfo)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
// 处理app用户数据
userService := service.UserService{}
err = userService.HandleAppUserInfo(tx, user, userInfo)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 处理app用户病例数据
err = userService.HandleAppUserCase(tx, user)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
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)
}

View File

@ -85,3 +85,122 @@ func (r *User) PutUser(c *gin.Context) {
responses.Ok(c) responses.Ok(c)
} }
// PutBindUserName 绑定用户数据-昵称
func (r *User) PutBindUserName(c *gin.Context) {
userRequest := requests.UserRequest{}
req := userRequest.PutBindUserName
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 req.Nickname == "" {
responses.FailWithMessage("参数错误", c)
return
}
userId := c.GetInt64("UserId")
// 获取用户数据
userDao := dao.UserDao{}
user, err := userDao.GetUserById(userId)
if err != nil {
responses.FailWithMessage("用户数据错误", c)
return
}
if user.UserName != "" {
responses.Ok(c)
return
}
userData := make(map[string]interface{})
userData["user_name"] = req.Nickname
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
err = userDao.EditUserById(tx, user.UserId, userData)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
tx.Commit()
responses.Ok(c)
}
// GetUserCheck 检测用户数据绑定状态
func (r *User) GetUserCheck(c *gin.Context) {
userRequest := requests.UserRequest{}
req := userRequest.GetUserCheck
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 req.Mobile == "" && req.OpenId == "" {
responses.FailWithMessage("缺少参数", c)
return
}
g := &dto.UserCheckDto{}
// 获取用户数据
maps := make(map[string]interface{})
if req.OpenId != "" {
maps["open_id"] = req.OpenId
}
if req.Mobile != "" {
maps["mobile"] = req.Mobile
}
userDao := dao.UserDao{}
user, err := userDao.GetUser(maps)
if err != nil || user == nil {
g.WxStatus = 0
g.MobileStatus = 0
g.NameStatus = 0
responses.OkWithData(g, c)
return
}
if user.UserStatus == 2 {
responses.FailWithMessage("用户已禁用", c)
return
}
if user.UserName != "" {
g.NameStatus = 1
}
if user.Mobile != "" {
g.MobileStatus = 1
}
if user.OpenId != "" {
g.WxStatus = 1
}
responses.OkWithData(g, c)
}

View File

@ -28,6 +28,13 @@ type UserDto struct {
UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间
} }
// UserCheckDto 检测用户
type UserCheckDto struct {
WxStatus int `json:"wx_status"` // 微信绑定状态0:否 1:是)
MobileStatus int `json:"mobile_status"` // 手机号绑定状态0:否 1:是)
NameStatus int `json:"name_status"` // 昵称填写状态0:否 1:是)
}
// GetUserDto 详情-问题 // GetUserDto 详情-问题
func GetUserDto(m *model.User) *UserDto { func GetUserDto(m *model.User) *UserDto {
return &UserDto{ return &UserDto{

View File

@ -1,22 +1,16 @@
package requests package requests
type LoginRequest struct { type LoginRequest struct {
LoginWx // 微信授权登录 Login // 登录
LoginPhone // 手机号登录
} }
// LoginWx 微信授权登录 // Login 登录
type LoginWx struct { type Login struct {
Mobile string `json:"mobile" form:"mobile" label:"手机号" validate:"required"` Mobile string `json:"mobile" form:"mobile" label:"手机号" validate:"required"`
OpenId string `json:"openid" form:"openid" label:"openid"` Code string `json:"code" form:"code" label:"验证码"`
Source int `json:"source" form:"source" label:"来源" validate:"required"` // 1app 2公众号
OpenId string `json:"openid" form:"openid" label:"openid" validate:"required"`
Nickname string `json:"nickname" form:"nickname" label:"用户昵称"` Nickname string `json:"nickname" form:"nickname" label:"用户昵称"`
HeadImgUrl string `json:"headimgurl" form:"headimgurl" label:"头像"` HeadImgUrl string `json:"headimgurl" form:"headimgurl" label:"头像"`
UnionId string `json:"unionid" form:"unionid" label:"unionid"` UnionId string `json:"unionid" form:"unionid" label:"unionid"`
} }
// LoginPhone 手机号登录
type LoginPhone struct {
Mobile string `json:"mobile" form:"mobile" label:"手机号" validate:"required"`
Code string `json:"code" form:"code" label:"验证码" validate:"required"`
Source int `json:"source" form:"source" label:"来源" validate:"required"` // 1app 2公众号
}

View File

@ -1,7 +1,9 @@
package requests package requests
type UserRequest struct { type UserRequest struct {
PutUser // 修改用户数据-基本信息 PutUser // 修改用户数据-基本信息
PutBindUserName // 绑定用户数据-昵称
GetUserCheck // 检测用户数据绑定状态
} }
// PutUser 修改用户数据-基本信息 // PutUser 修改用户数据-基本信息
@ -20,3 +22,14 @@ type PutUser struct {
CityId string `json:"city_id" form:"city_id" label:"城市id" validate:"required"` // 从int转换为可选字符串 CityId string `json:"city_id" form:"city_id" label:"城市id" validate:"required"` // 从int转换为可选字符串
CountyId string `json:"county_id" form:"county_id" label:"区县id" validate:"required"` // 从int转换为可选字符串 CountyId string `json:"county_id" form:"county_id" label:"区县id" validate:"required"` // 从int转换为可选字符串
} }
// PutBindUserName 绑定用户数据-昵称
type PutBindUserName struct {
Nickname string `json:"nickname" form:"nickname" label:"用户昵称"`
}
// GetUserCheck 检测用户数据绑定状态
type GetUserCheck struct {
Mobile string `json:"mobile" form:"mobile" label:"mobile"`
OpenId string `json:"openid" form:"openid" label:"openid"`
}

View File

@ -75,11 +75,15 @@ func publicRouter(r *gin.Engine, api controller.Api) {
// 登陆 // 登陆
loginGroup := r.Group("/login") loginGroup := r.Group("/login")
{ {
// 手机号登录 // 登录
loginGroup.POST("/phone", api.Login.LoginPhone) loginGroup.POST("", api.Login.Login)
}
// 微信授权登录 // 用户
loginGroup.POST("/wx", api.Login.LoginWx) centerGroup := r.Group("/user")
{
// 检测用户数据绑定状态
centerGroup.GET("/check", api.User.GetUserCheck)
} }
// 验证码 // 验证码

View File

@ -158,8 +158,8 @@ func (r *UserService) AddUserMemberBuyCount(tx *gorm.DB, userId int64) (bool, er
return true, nil return true, nil
} }
// HandleAppUserInfo 处理app用户数据 // GetAppUserInfo 查询app用户数据
func (r *UserService) HandleAppUserInfo(tx *gorm.DB, user *model.User, userInfo *model.UserInfo) error { func (r *UserService) GetAppUserInfo(tx *gorm.DB, user *model.User, userInfo *model.UserInfo) error {
appUserInfo, err := app.GetInfoByMobile(user.Mobile) appUserInfo, err := app.GetInfoByMobile(user.Mobile)
if err != nil { if err != nil {
return err return err
@ -424,8 +424,8 @@ func (r *UserService) HandleAppUserInfo(tx *gorm.DB, user *model.User, userInfo
return nil return nil
} }
// HandleAppUserCase 处理app用户病例数据 // GetAppUserCase 查询app用户病例数据
func (r *UserService) HandleAppUserCase(tx *gorm.DB, user *model.User) error { func (r *UserService) GetAppUserCase(tx *gorm.DB, user *model.User) error {
appUserCase, err := app.GetUserCaseByAppIden(user.AppIden) appUserCase, err := app.GetUserCaseByAppIden(user.AppIden)
if err != nil { if err != nil {
return err return err