package login import ( "epur-pay/cache" "epur-pay/model" "epur-pay/pkg/dapi" "epur-pay/pkg/utils" "fmt" "golang.org/x/crypto/bcrypt" ) type SsoLoginParams struct { Mobile string `json:"mobile"` // 登陆手机号 Password string `json:"passWord"` // 密码 } type SsoLoginResponse struct { *dapi.ResponseCommon Data struct { Token string `json:"token"` //返回token } `json:"data"` //数据列表 } // SsoLogin 用户登录接口 // @Summary 用户登录 // @Description 该接口用于用户通过手机号和密码进行登录。如果登录失败,系统会记录错误信息并限制登录次数。 // @Tags login // @Accept json // @Produce json // @Param mobile query string true "用户手机号" // @Param password query string true "用户密码" // @Success 200 {object} SsoLoginResponse "登录成功返回Token" // @Router /api/v1/login/register [post] func SsoLogin(a *dapi.ApiBase, data *SsoLoginParams) error { Response := SsoLoginResponse{} user := model.User{} utils.Error(a.Ts.Table(user.TableName()).Where("mobile", data.Mobile).Scan(&user).Error) //if len(user.Role) <= 0 { // return a.ReturnPublicErrorResponse(a.Translate("user_role_invalid")) //} if a.Log != nil { a.Log.Uid = user.Uid a.Log.Name = user.Mobile a.Log.Event = "登陆" } lockNums := cache.Global.Caches.Config.GetInt64("lockNums") lockMins := cache.Global.Caches.Config.GetInt64("lockMins") if lockNums > 0 && lockMins > 0 { currTime := utils.Time2StampSecond() if user.Detail.LoginErrorCount >= lockNums && currTime-user.Detail.LoginErrorTime < lockMins*60 { //输入5次密码错误 锁5分钟 return a.ReturnPublicErrorResponse(fmt.Sprintf(a.Translate("pwd_error_lock"), lockNums, user.Detail.LoginErrorTime+lockMins*60-currTime)) //密码输入错误超过%d次,%d秒后可以继续操作 } } if err := bcrypt.CompareHashAndPassword([]byte(user.Detail.PassWord), []byte(data.Password)); err != nil { user.Detail.LoginErrorTime = utils.Time2StampSecond() user.Detail.LoginErrorCount += 1 utils.DbErrSkipRecordNotFound(a.Ts.Table(user.TableName()). Where("uid", user.Uid). Updates(map[string]interface{}{"detail": user.Detail}).Error) return a.ReturnPublicErrorResponse(a.Translate("pwd_error")) } if user.Status != "0" { return a.ReturnPublicErrorResponse(a.Translate("user_blacklist")) } user.Detail.Token = dapi.EncryptToken(user.Uid) user.Detail.LoginIp = a.ClientIp() user.Detail.LoginIpAddress = cache.GetIpAddress(user.Detail.LoginIp) user.Detail.LoginTime = utils.Time2StampSecond() user.Detail.LoginErrorCount = 0 utils.DbErrSkipRecordNotFound(a.Ts.Table(user.TableName()). Where("uid", user.Uid). Updates(map[string]interface{}{"detail": user.Detail}).Error) a.AfterCallback = func() { // 这里需要刷新权限标识 cache.Global.Caches.User.RefreshSelectRow(user.Uid) } Response.Data.Token = user.Detail.Token Response.ResponseCommon = a.NewSuccessResponseCommon() return a.ReturnSuccessCustomResponse(Response) } type UserInfoResponse struct { *dapi.ResponseCommon Data struct { Uid int64 `json:"uid"` // 会员ID Type string `json:"type"` // 用户类型 0-普通用户 1-体验用户 Account string `json:"account"` // 登录账号 Email string `json:"email"` // 绑定邮箱 Mobile string `json:"mobile"` // 手机号 - 格式:+86 1234 Invite string `json:"invite"` // 邀请码 Auth string `json:"auth"` // 实名认证 0-未认证 1-审核中 2-已认证 AdvancedStatus string `json:"advancedStatus"` // 高级认证状态 0-未认证 1-审核中 2-已认证 3-已拒绝 Nickname string `json:"nickName"` // 用户名称 Avatar string `json:"avatar"` // 用户头像 ResourceId int64 `json:"resourceId"` // 头像资源文件 Gender string `json:"gender"` // 0-男 1-女 2-未知 Token string `json:"token"` // 登陆token Integral string `json:"integral"` // 信用积分 IsGoogle string `json:"isGoogle"` // 是否绑定google验证 0-是 1-否 GoogleCodeUrl string `json:"googleCodeUrl"` // google地址 IsPayPwd string `json:"isPayPwd"` // 是否设置支付密码 0-是 1-否 Role model.ArryString `json:"role"` // 角色 LoginIp string `json:"loginIp"` // 登陆ip LoginIpAddress string `json:"loginIpAddress,omitempty"` // 登陆ip Date string `json:"date"` } `json:"data"` //数据列表 } /* @Summary 用户详情 @Router /user/info [post] */ func UserInfo(a *dapi.ApiBase) error { Response := UserInfoResponse{} Response.Data.Uid = a.User.Uid Response.Data.Account = a.User.Account Response.Data.Email = a.User.Email Response.Data.Mobile = a.User.Mobile Response.Data.Invite = a.User.Invite Response.Data.Nickname = a.User.Detail.Nickname Response.Data.Gender = a.User.Detail.Gender Response.Data.Token = a.User.Detail.Token Response.Data.LoginIp = a.User.Detail.LoginIp Response.Data.LoginIpAddress = a.User.Detail.LoginIpAddress if len(Response.Data.LoginIpAddress) <= 0 { Response.Data.LoginIpAddress = cache.GetIpAddress(Response.Data.LoginIp) } if len(a.User.Detail.PayPassWord) > 0 { Response.Data.IsPayPwd = "0" } else { Response.Data.IsPayPwd = "1" } // 角色 Response.Data.Role = a.User.Role Response.ResponseCommon = a.NewSuccessResponseCommon() return a.ReturnSuccessCustomResponse(Response) }