auth_controller.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package user
  2. import (
  3. "eta_mini_ht_api/common/component/config"
  4. logger "eta_mini_ht_api/common/component/log"
  5. "eta_mini_ht_api/common/contants"
  6. "eta_mini_ht_api/common/exception"
  7. authUtils "eta_mini_ht_api/common/utils/auth"
  8. "eta_mini_ht_api/controllers"
  9. "eta_mini_ht_api/service/auth"
  10. )
  11. type AuthController struct {
  12. controllers.BaseController
  13. }
  14. const ChinaAreaCode = "86"
  15. // LoginReq 获取验证码请求
  16. type LoginReq struct {
  17. Code string `json:"code"`
  18. VerifyCode string `json:"verify_code"`
  19. Mobile string `json:"mobile"`
  20. AreaCode string `json:"area_code"`
  21. }
  22. // Login 小程序登录接口
  23. // @Summary 小程序用户登录
  24. // @Description 用户通过微信小程序登录
  25. // @Param mobile body LoginReq true "登录请求体"
  26. // @Success 200 {object} controllers.BaseResponse
  27. // @router /login [post]
  28. func (a *AuthController) Login() {
  29. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  30. result = a.InitWrapData("登录失败")
  31. loginReq := new(LoginReq)
  32. a.GetPostParams(loginReq)
  33. if loginReq.AreaCode == "" || !checkValidAreaCode(loginReq.AreaCode) {
  34. a.FailedResult("登录失败", result)
  35. err = exception.New(exception.IllegalAreaCode)
  36. return
  37. }
  38. if loginReq.AreaCode == ChinaAreaCode && !authUtils.IsValidMobile(loginReq.Mobile) {
  39. a.FailedResult("登录失败", result)
  40. err = exception.New(exception.IllegalPhoneNumber)
  41. return
  42. }
  43. err = auth.CheckUser(loginReq.Mobile, loginReq.VerifyCode)
  44. if err != nil {
  45. a.FailedResult("登录失败", result)
  46. logger.Warn("验证码校验失败:%v", err)
  47. return
  48. }
  49. //注册用户或者登录
  50. var token string
  51. token, err = auth.Login(auth.LoginDTO{
  52. VerifyCode: loginReq.VerifyCode,
  53. Code: loginReq.Code,
  54. Mobile: loginReq.Mobile,
  55. })
  56. if err != nil {
  57. a.FailedResult("登录失败", result)
  58. return
  59. }
  60. a.SuccessResult("登录成功", &LoginResp{
  61. Token: token,
  62. }, result)
  63. return
  64. })
  65. }
  66. type LoginResp struct {
  67. Token string
  68. }
  69. // SmsCodeReq 获取验证码请求
  70. type SmsCodeReq struct {
  71. Mobile string `json:"mobile"`
  72. AreaCode string `json:"area_code"`
  73. }
  74. // SMSCode 小程序手机验证码接口
  75. // @Summary 获取手机验证码
  76. // @Param mobile body SmsCodeReq true "小程序手机验证码接口"
  77. // @Success 200 {object} controllers.BaseResponse
  78. // @Description 用户发送手机验证码
  79. // @router /sendCode [post]
  80. func (a *AuthController) SMSCode() {
  81. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  82. result = a.InitWrapData("发送短信失败")
  83. mobile := new(SmsCodeReq)
  84. a.GetPostParams(mobile)
  85. if mobile.AreaCode == "" || !checkValidAreaCode(mobile.AreaCode) {
  86. a.FailedResult("登录失败", result)
  87. err = exception.New(exception.IllegalAreaCode)
  88. return
  89. }
  90. phoneNum := mobile.Mobile
  91. if mobile.AreaCode == ChinaAreaCode && !authUtils.IsValidMobile(phoneNum) {
  92. return result, exception.New(exception.IllegalPhoneNumber)
  93. }
  94. //发送短息
  95. err = auth.SendSMSCode(phoneNum)
  96. if err != nil {
  97. logger.Warn("发送短信失败:%v", err)
  98. return result, err
  99. }
  100. if err != nil {
  101. return result, err
  102. }
  103. result = &controllers.WrapData{Msg: "验证码发送成功"}
  104. return result, nil
  105. })
  106. }
  107. type RefreshTokenRes struct {
  108. Token string `json:"token"`
  109. }
  110. // RefreshToken 更新token
  111. // @Summary 更新token
  112. // @Success 200 {object} controllers.BaseResponse
  113. // @Description 更新token
  114. // @router /refreshToken [get]
  115. func (a *AuthController) RefreshToken(code string) {
  116. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  117. result = a.InitWrapData("刷新token失败")
  118. if code == "" {
  119. logger.Error("code不能为空")
  120. return result, exception.New(exception.WeChatCodeEmpty)
  121. }
  122. //刷新token
  123. token, err := auth.RefreshToken(code)
  124. if err != nil {
  125. logger.Error("刷新token失败:%v", err)
  126. a.FailedResult("刷新token失败", result)
  127. return
  128. }
  129. a.SuccessResult("刷新token成功", RefreshTokenRes{
  130. Token: token,
  131. }, result)
  132. return
  133. })
  134. }
  135. // AreaCodes 小程序手机验证码接口
  136. // @Summary 获取手机验证码
  137. // @Param mobile body SmsCodeReq true "小程序手机验证码接口"
  138. // @Success 200 {object} controllers.BaseResponse
  139. // @Description 用户发送手机验证码
  140. // @router /areaCodes [get]
  141. func (a *AuthController) AreaCodes() {
  142. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  143. result = a.InitWrapData("获取区号失败")
  144. list, err := auth.GetAreaCodes()
  145. if err != nil {
  146. a.FailedResult("获取区号失败", result)
  147. }
  148. a.SuccessResult("获取区号成功", list, result)
  149. return
  150. })
  151. }
  152. type WXAppidResp struct {
  153. AppId string
  154. }
  155. // WXAppid 获取APPID
  156. // @Summary 获取APPID
  157. // @Success 200 {object} controllers.BaseResponse
  158. // @Description 获取APPID
  159. // @router /wxAppid [get]
  160. func (a *AuthController) WXAppid() {
  161. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  162. result = a.InitWrapData("获取AppId失败")
  163. appid := config.GetConfig(contants.WECHAT).(*config.WechatConfig).GetAppid()
  164. if err != nil {
  165. a.FailedResult("获取AppId失败", result)
  166. }
  167. a.SuccessResult("获取AppId成功", WXAppidResp{
  168. AppId: appid,
  169. }, result)
  170. return
  171. })
  172. }
  173. // Test 获取APPID
  174. // @Success 200 {object} controllers.BaseResponse
  175. // @Description 获取APPID
  176. // @router /test [get]
  177. func (a *AuthController) Test() {
  178. auth.GetValidAreaCodes()
  179. }
  180. func checkValidAreaCode(areaCode string) bool {
  181. list := auth.GetValidAreaCodes()
  182. if areaCode == "" || len(list) == 0 {
  183. return false
  184. }
  185. for _, code := range list {
  186. if areaCode == code {
  187. return true
  188. }
  189. }
  190. return false
  191. }