user.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_api/models"
  5. "eta/eta_mini_api/models/request"
  6. "eta/eta_mini_api/models/response"
  7. "eta/eta_mini_api/services"
  8. "eta/eta_mini_api/services/go_redis"
  9. "eta/eta_mini_api/utils"
  10. "fmt"
  11. "strconv"
  12. "time"
  13. )
  14. type UserController struct {
  15. BaseCommonController
  16. }
  17. type UserAuthController struct {
  18. BaseAuthController
  19. }
  20. // AreaCodeList
  21. // @Title 手机号区号列表
  22. // @Description 手机号区号列表
  23. // @Success 200 Ret=200 获取成功
  24. // @router /area_code/list [get]
  25. func (this *UserController) AreaCodeList() {
  26. br := new(models.BaseResponse).Init()
  27. defer func() {
  28. if br.ErrMsg == "" {
  29. br.IsSendEmail = false
  30. }
  31. this.Data["json"] = br
  32. this.ServeJSON()
  33. }()
  34. resp := make([]response.AreaCodeListResp, 0)
  35. confValue, e := models.GetConfigDetailByCode(models.ConfAreaCodeListKey)
  36. if e != nil {
  37. br.Msg = "获取失败"
  38. br.ErrMsg = "获取手机号区号配置失败, Err: " + e.Error()
  39. return
  40. }
  41. if confValue == "" {
  42. br.Msg = "获取失败"
  43. br.ErrMsg = "手机号区号配置为空"
  44. return
  45. }
  46. if e := json.Unmarshal([]byte(confValue), &resp); e != nil {
  47. br.Msg = "获取失败"
  48. br.ErrMsg = "手机号区号配置有误"
  49. return
  50. }
  51. br.Data = resp
  52. br.Ret = 200
  53. br.Success = true
  54. br.Msg = "获取成功"
  55. }
  56. // GetVerifyCode
  57. // @Title 获取短信/邮箱验证码
  58. // @Description 用户登录
  59. // @Param request body models.LoginReq true "type json string"
  60. // @Success 200 {object} models.LoginResp
  61. // @router /get_verify_code [post]
  62. func (this *UserController) GetVerifyCode() {
  63. br := new(models.BaseResponse).Init()
  64. defer func() {
  65. this.Data["json"] = br
  66. this.ServeJSON()
  67. }()
  68. var req request.VerifyCodeReq
  69. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  70. br.Msg = "参数解析异常!"
  71. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  72. return
  73. }
  74. if req.AreaCode == "" {
  75. br.Msg = "请选择区号"
  76. return
  77. }
  78. if req.Phone == "" {
  79. br.Msg = "请输入手机号"
  80. return
  81. }
  82. if req.AreaCode == utils.TelAreaCodeHome && !utils.ValidateMobileFormatat(req.Phone) {
  83. br.Msg = "您的手机号输入有误, 请检查"
  84. return
  85. }
  86. phoneKey := utils.CACHE_ACCESS_PHONE_LOGIN_CODE + req.AreaCode + req.Phone
  87. res, _ := go_redis.RedisInt(phoneKey)
  88. if res >= 5 {
  89. br.Msg = "验证码发送太频繁,请稍后重试"
  90. return
  91. }
  92. phoneCountKey := utils.CACHE_ACCESS_PHONE_COUNT_LOGIN_CODE + req.AreaCode + req.Phone
  93. resCount, _ := go_redis.RedisInt(phoneCountKey)
  94. if resCount >= utils.VerifyCodeSendLimit {
  95. br.Msg = fmt.Sprintf("一天最多获取%s次,已超限", strconv.Itoa(utils.VerifyCodeSendLimit))
  96. return
  97. }
  98. code := utils.GetRandDigit(6)
  99. var (
  100. sendOk bool
  101. sendResult string
  102. err error
  103. )
  104. if utils.RunMode == "release" {
  105. var pars services.SmsApiPars
  106. pars.PhoneList = append(pars.PhoneList, req.Phone)
  107. pars.ServiceProvider = services.SmsApiServiceProviderDefault
  108. pars.SmsContent = fmt.Sprintf("验证码短信:<br>【金瑞期货】您的短信验证码是%s,有效期15分钟", code)
  109. pars.Sender = "金瑞小程序"
  110. pars.Department = "信息技术部"
  111. pars.Purpose = "小程序登录短信验证码"
  112. result, e := services.PostSmsApi(pars)
  113. sendOk = true
  114. if e != nil {
  115. err = fmt.Errorf("发送短信验证码失败, %v", e)
  116. sendOk = false
  117. }
  118. sendResult = result
  119. } else {
  120. // 测试环境用聚合
  121. ok, result, e := services.SendSmsCode(req.Phone, code)
  122. if e != nil {
  123. err = fmt.Errorf("发送短信验证码失败, %v", e)
  124. }
  125. sendOk = ok
  126. sendResult = result
  127. }
  128. item := new(models.MsgCode)
  129. item.Code = code
  130. item.Mobile = req.AreaCode + req.Phone
  131. item.ApiResult = sendResult
  132. item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix()
  133. item.CreateTime = time.Now()
  134. if e := item.Insert(); e != nil {
  135. br.Msg = "发送失败"
  136. br.ErrMsg = fmt.Sprintf("新增短信发送记录失败, %v", e)
  137. return
  138. }
  139. if err != nil || !sendOk {
  140. br.Msg = "发送失败"
  141. br.ErrMsg = fmt.Sprintf("发送短信验证码失败, %v", err)
  142. return
  143. }
  144. phoneVerifyCacheSvc := &services.VerifyCacheIncrService{}
  145. if e := phoneVerifyCacheSvc.VerifyCacheIncr(phoneKey, 15*int(time.Minute.Seconds())); e != nil {
  146. utils.FileLog.Info(fmt.Sprintf("验证码手机号临时缓存失败, %v", e))
  147. }
  148. if e := phoneVerifyCacheSvc.VerifyCacheIncr(phoneCountKey, int(utils.SetKeyExpireToday().Seconds())); e != nil {
  149. utils.FileLog.Info(fmt.Sprintf("验证码手机号当日缓存失败, %v", e))
  150. }
  151. br.Ret = 200
  152. br.Success = true
  153. br.Msg = "发送成功"
  154. }
  155. // Login
  156. // @Title 用户登录
  157. // @Description 用户登录接口
  158. // @Param request body models.LoginReq true "type json string"
  159. // @Success 200 {object} models.Users
  160. // @router /login [post]
  161. func (this *UserAuthController) Login() {
  162. br := new(models.BaseResponse).Init()
  163. defer func() {
  164. this.Data["json"] = br
  165. this.ServeJSON()
  166. }()
  167. session := this.Session
  168. var req request.LoginReq
  169. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  170. if err != nil {
  171. br.Msg = "参数解析失败"
  172. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  173. return
  174. }
  175. if req.Phone == "" {
  176. br.Msg = "请输入手机号"
  177. br.ErrMsg = "请输入手机号"
  178. return
  179. }
  180. if req.SmsCode == "" {
  181. br.Msg = "请输入验证码"
  182. br.ErrMsg = "请输入验证码"
  183. return
  184. }
  185. if session.OpenId == "" {
  186. br.Msg = "登录失败"
  187. br.ErrMsg = fmt.Sprintf("用户open_id为空")
  188. return
  189. }
  190. phone := req.AreaCode + req.Phone
  191. _, e := models.GetMsgCode(phone, req.SmsCode)
  192. if e != nil {
  193. br.Msg = "验证码有误,请重新输入"
  194. br.ErrMsg = fmt.Sprintf("获取验证码失败, %v", e)
  195. return
  196. }
  197. users, tips, e := services.BindUser(session.UnionId, session.OpenId, req.Phone, req.AreaCode)
  198. if e != nil {
  199. br.Msg = "登录失败"
  200. br.ErrMsg = fmt.Sprintf("登录失败, %v", e)
  201. if tips != "" {
  202. br.Msg = tips
  203. }
  204. return
  205. }
  206. br.Data = users
  207. br.Ret = 200
  208. br.Msg = "登录成功"
  209. br.Success = true
  210. }
  211. // Info
  212. // @Title 用户信息
  213. // @Description 获取用户信息
  214. // @Success 200 {object} response.UserInfoResp
  215. // @router /info [post]
  216. func (this *UserAuthController) Info() {
  217. br := new(models.BaseResponse).Init()
  218. defer func() {
  219. this.Data["json"] = br
  220. this.ServeJSON()
  221. }()
  222. session := this.Session
  223. if session == nil || (session != nil && session.OpenId == "") {
  224. br.Msg = "参数有误"
  225. return
  226. }
  227. resp := new(response.UserInfoResp)
  228. usersOb := new(models.Users)
  229. {
  230. cond := fmt.Sprintf(` AND %s = ?`, usersOb.Cols().OpenId)
  231. pars := make([]interface{}, 0)
  232. pars = append(pars, session.OpenId)
  233. item, e := usersOb.GetItemByCondition(cond, pars, "")
  234. if e != nil && e.Error() != utils.ErrNoRow() {
  235. br.Msg = "获取失败"
  236. br.ErrMsg = fmt.Sprintf("OpenId获取用户失败, %v", e)
  237. return
  238. }
  239. if item != nil {
  240. resp.User = item.Format2Item()
  241. resp.LoginStatus = utils.UserStatusIsLogin
  242. }
  243. }
  244. br.Data = resp
  245. br.Ret = 200
  246. br.Msg = "获取成功"
  247. br.Success = true
  248. }