package controllers import ( "encoding/json" "eta/eta_mini_api/models" "eta/eta_mini_api/models/request" "eta/eta_mini_api/models/response" "eta/eta_mini_api/services" "eta/eta_mini_api/services/go_redis" "eta/eta_mini_api/utils" "fmt" "strconv" "time" ) type UserController struct { BaseCommonController } type UserAuthController struct { BaseAuthController } // AreaCodeList // @Title 手机号区号列表 // @Description 手机号区号列表 // @Success 200 Ret=200 获取成功 // @router /area_code/list [get] func (this *UserController) AreaCodeList() { br := new(models.BaseResponse).Init() defer func() { if br.ErrMsg == "" { br.IsSendEmail = false } this.Data["json"] = br this.ServeJSON() }() resp := make([]response.AreaCodeListResp, 0) confValue, e := models.GetConfigDetailByCode(models.ConfAreaCodeListKey) if e != nil { br.Msg = "获取失败" br.ErrMsg = "获取手机号区号配置失败, Err: " + e.Error() return } if confValue == "" { br.Msg = "获取失败" br.ErrMsg = "手机号区号配置为空" return } if e := json.Unmarshal([]byte(confValue), &resp); e != nil { br.Msg = "获取失败" br.ErrMsg = "手机号区号配置有误" return } br.Data = resp br.Ret = 200 br.Success = true br.Msg = "获取成功" } // GetVerifyCode // @Title 获取短信/邮箱验证码 // @Description 用户登录 // @Param request body models.LoginReq true "type json string" // @Success 200 {object} models.LoginResp // @router /get_verify_code [post] func (this *UserController) GetVerifyCode() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.VerifyCodeReq if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil { br.Msg = "参数解析异常!" br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e) return } if req.AreaCode == "" { br.Msg = "请选择区号" return } if req.Phone == "" { br.Msg = "请输入手机号" return } if req.AreaCode == utils.TelAreaCodeHome && !utils.ValidateMobileFormatat(req.Phone) { br.Msg = "您的手机号输入有误, 请检查" return } phoneKey := utils.CACHE_ACCESS_PHONE_LOGIN_CODE + req.AreaCode + req.Phone res, _ := go_redis.RedisInt(phoneKey) if res >= 5 { br.Msg = "验证码发送太频繁,请稍后重试" return } phoneCountKey := utils.CACHE_ACCESS_PHONE_COUNT_LOGIN_CODE + req.AreaCode + req.Phone resCount, _ := go_redis.RedisInt(phoneCountKey) if resCount >= utils.VerifyCodeSendLimit { br.Msg = fmt.Sprintf("一天最多获取%s次,已超限", strconv.Itoa(utils.VerifyCodeSendLimit)) return } code := utils.GetRandDigit(6) var ( sendOk bool sendResult string err error ) if utils.RunMode == "release" { var pars services.SmsApiPars pars.PhoneList = append(pars.PhoneList, req.Phone) pars.ServiceProvider = services.SmsApiServiceProviderDefault pars.SmsContent = fmt.Sprintf("【金瑞期货】您的短信验证码是%s,有效期15分钟", code) pars.Sender = "金瑞小程序" pars.Department = "信息技术部" pars.Purpose = "小程序登录短信验证码" result, e := services.PostSmsApi(pars) sendOk = true if e != nil { err = fmt.Errorf("发送短信验证码失败, %v", e) sendOk = false } sendResult = result } else { // 测试环境用聚合 ok, result, e := services.SendSmsCode(req.Phone, code) if e != nil { err = fmt.Errorf("发送短信验证码失败, %v", e) } sendOk = ok sendResult = result } item := new(models.MsgCode) item.Code = code item.Mobile = req.AreaCode + req.Phone item.ApiResult = sendResult item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix() item.CreateTime = time.Now() if e := item.Insert(); e != nil { br.Msg = "发送失败" br.ErrMsg = fmt.Sprintf("新增短信发送记录失败, %v", e) return } if err != nil || !sendOk { br.Msg = "发送失败" br.ErrMsg = fmt.Sprintf("发送短信验证码失败, %v", err) return } // 设置缓存 if go_redis.IsExist(phoneKey) { if e := go_redis.Incr(phoneKey); e != nil { utils.FileLog.Info(fmt.Sprintf("验证码手机号临时缓存失败, %v", e)) } } else { go_redis.Set(phoneKey, 1, 15*time.Minute) } if go_redis.IsExist(phoneCountKey) { if e := go_redis.Incr(phoneCountKey); e != nil { utils.FileLog.Info(fmt.Sprintf("验证码手机号当日缓存失败, %v", e)) } } else { go_redis.Set(phoneCountKey, 1, utils.SetKeyExpireToday()) } br.Ret = 200 br.Success = true br.Msg = "发送成功" } // Login // @Title 用户登录 // @Description 用户登录接口 // @Param request body models.LoginReq true "type json string" // @Success 200 {object} models.Users // @router /login [post] func (this *UserAuthController) Login() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() session := this.Session var req request.LoginReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析失败" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.Phone == "" { br.Msg = "请输入手机号" br.ErrMsg = "请输入手机号" return } if req.SmsCode == "" { br.Msg = "请输入验证码" br.ErrMsg = "请输入验证码" return } if session.OpenId == "" { br.Msg = "登录失败" br.ErrMsg = fmt.Sprintf("用户open_id为空") return } phone := req.AreaCode + req.Phone _, e := models.GetMsgCode(phone, req.SmsCode) if e != nil { br.Msg = "验证码有误,请重新输入" br.ErrMsg = fmt.Sprintf("获取验证码失败, %v", e) return } users, tips, e := services.BindUser(session.UnionId, session.OpenId, req.Phone, req.AreaCode) if e != nil { br.Msg = "登录失败" br.ErrMsg = fmt.Sprintf("登录失败, %v", e) if tips != "" { br.Msg = tips } return } br.Data = users br.Ret = 200 br.Msg = "登录成功" br.Success = true } // Info // @Title 用户信息 // @Description 获取用户信息 // @Success 200 {object} response.UserInfoResp // @router /info [post] func (this *UserAuthController) Info() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() session := this.Session if session == nil || (session != nil && session.OpenId == "") { br.Msg = "参数有误" return } resp := new(response.UserInfoResp) usersOb := new(models.Users) { cond := fmt.Sprintf(` AND %s = ?`, usersOb.Cols().OpenId) pars := make([]interface{}, 0) pars = append(pars, session.OpenId) item, e := usersOb.GetItemByCondition(cond, pars, "") if e != nil && e.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = fmt.Sprintf("OpenId获取用户失败, %v", e) return } if item != nil { resp.User = item.Format2Item() resp.LoginStatus = utils.UserStatusIsLogin } } br.Data = resp br.Ret = 200 br.Msg = "获取成功" br.Success = true } // SendSms // @Title 测试-发送短信 // @Description 测试-发送短信 // @Param request body models.LoginReq true "type json string" // @Success 200 {object} models.Users // @router /send_sms [post] func (this *UserController) SendSms() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.LoginReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析失败" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.Phone == "" { br.Msg = "请输入手机号" br.ErrMsg = "请输入手机号" return } code := utils.GetRandDigit(6) var pars services.SmsApiPars pars.PhoneList = append(pars.PhoneList, req.Phone) pars.ServiceProvider = services.SmsApiServiceProviderDefault pars.SmsContent = fmt.Sprintf("【金瑞期货】您的短信验证码是%s,有效期15分钟", code) pars.Sender = "金瑞小程序" pars.Department = "信息技术部" pars.Purpose = "小程序登录短信验证码" result, e := services.PostSmsApi(pars) sendOk := true if e != nil { sendOk = false } fmt.Println(result) utils.FileLog.Debug(result) br.Data = sendOk br.Ret = 200 br.Msg = "发送成功" br.Success = true }