user.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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. // 设置缓存
  145. if go_redis.IsExist(phoneKey) {
  146. if e := go_redis.Incr(phoneKey); e != nil {
  147. utils.FileLog.Info(fmt.Sprintf("验证码手机号临时缓存失败, %v", e))
  148. }
  149. } else {
  150. go_redis.Set(phoneKey, 1, 15*time.Minute)
  151. }
  152. if go_redis.IsExist(phoneCountKey) {
  153. if e := go_redis.Incr(phoneCountKey); e != nil {
  154. utils.FileLog.Info(fmt.Sprintf("验证码手机号当日缓存失败, %v", e))
  155. }
  156. } else {
  157. go_redis.Set(phoneCountKey, 1, utils.SetKeyExpireToday())
  158. }
  159. br.Ret = 200
  160. br.Success = true
  161. br.Msg = "发送成功"
  162. }
  163. // Login
  164. // @Title 用户登录
  165. // @Description 用户登录接口
  166. // @Param request body models.LoginReq true "type json string"
  167. // @Success 200 {object} models.Users
  168. // @router /login [post]
  169. func (this *UserAuthController) Login() {
  170. br := new(models.BaseResponse).Init()
  171. defer func() {
  172. this.Data["json"] = br
  173. this.ServeJSON()
  174. }()
  175. session := this.Session
  176. var req request.LoginReq
  177. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  178. if err != nil {
  179. br.Msg = "参数解析失败"
  180. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  181. return
  182. }
  183. if req.Phone == "" {
  184. br.Msg = "请输入手机号"
  185. br.ErrMsg = "请输入手机号"
  186. return
  187. }
  188. if req.SmsCode == "" {
  189. br.Msg = "请输入验证码"
  190. br.ErrMsg = "请输入验证码"
  191. return
  192. }
  193. if session.OpenId == "" {
  194. br.Msg = "登录失败"
  195. br.ErrMsg = fmt.Sprintf("用户open_id为空")
  196. return
  197. }
  198. phone := req.AreaCode + req.Phone
  199. _, e := models.GetMsgCode(phone, req.SmsCode)
  200. if e != nil {
  201. br.Msg = "验证码有误,请重新输入"
  202. br.ErrMsg = fmt.Sprintf("获取验证码失败, %v", e)
  203. return
  204. }
  205. users, tips, e := services.BindUser(session.UnionId, session.OpenId, req.Phone, req.AreaCode)
  206. if e != nil {
  207. br.Msg = "登录失败"
  208. br.ErrMsg = fmt.Sprintf("登录失败, %v", e)
  209. if tips != "" {
  210. br.Msg = tips
  211. }
  212. return
  213. }
  214. br.Data = users
  215. br.Ret = 200
  216. br.Msg = "登录成功"
  217. br.Success = true
  218. }
  219. // Info
  220. // @Title 用户信息
  221. // @Description 获取用户信息
  222. // @Success 200 {object} response.UserInfoResp
  223. // @router /info [post]
  224. func (this *UserAuthController) Info() {
  225. br := new(models.BaseResponse).Init()
  226. defer func() {
  227. this.Data["json"] = br
  228. this.ServeJSON()
  229. }()
  230. session := this.Session
  231. if session == nil || (session != nil && session.OpenId == "") {
  232. br.Msg = "参数有误"
  233. return
  234. }
  235. resp := new(response.UserInfoResp)
  236. usersOb := new(models.Users)
  237. {
  238. cond := fmt.Sprintf(` AND %s = ?`, usersOb.Cols().OpenId)
  239. pars := make([]interface{}, 0)
  240. pars = append(pars, session.OpenId)
  241. item, e := usersOb.GetItemByCondition(cond, pars, "")
  242. if e != nil && e.Error() != utils.ErrNoRow() {
  243. br.Msg = "获取失败"
  244. br.ErrMsg = fmt.Sprintf("OpenId获取用户失败, %v", e)
  245. return
  246. }
  247. if item != nil {
  248. resp.User = item.Format2Item()
  249. resp.LoginStatus = utils.UserStatusIsLogin
  250. }
  251. }
  252. br.Data = resp
  253. br.Ret = 200
  254. br.Msg = "获取成功"
  255. br.Success = true
  256. }