auth_controller.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package user
  2. import (
  3. "bufio"
  4. "eta/eta_mini_ht_api/common/component/config"
  5. logger "eta/eta_mini_ht_api/common/component/log"
  6. "eta/eta_mini_ht_api/common/contants"
  7. "eta/eta_mini_ht_api/common/exception"
  8. authUtils "eta/eta_mini_ht_api/common/utils/auth"
  9. "eta/eta_mini_ht_api/controllers"
  10. "eta/eta_mini_ht_api/service/auth"
  11. "eta/eta_mini_ht_api/service/user"
  12. "fmt"
  13. "os"
  14. "strings"
  15. )
  16. type AuthController struct {
  17. controllers.BaseController
  18. }
  19. const ChinaAreaCode = "86"
  20. // LoginReq 获取验证码请求
  21. type LoginReq struct {
  22. VerifyCode string `json:"verifyCode"`
  23. Mobile string `json:"mobile"`
  24. AreaCode string `json:"areaCode"`
  25. }
  26. // Login 小程序登录接口
  27. // @Summary 小程序用户登录
  28. // @Description 用户通过微信小程序登录
  29. // @Param mobile body LoginReq true "登录请求体"
  30. // @Success 200 {object} controllers.BaseResponse
  31. // @router /login [post]
  32. func (a *AuthController) Login() {
  33. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  34. result = a.InitWrapData("登录失败")
  35. loginReq := new(LoginReq)
  36. a.GetPostParams(loginReq)
  37. if loginReq.AreaCode == "" || !checkValidAreaCode(loginReq.AreaCode) {
  38. a.FailedResult("登录失败", result)
  39. err = exception.New(exception.IllegalAreaCode)
  40. return
  41. }
  42. if loginReq.AreaCode == ChinaAreaCode && !authUtils.IsValidMobile(loginReq.Mobile) {
  43. a.FailedResult("登录失败", result)
  44. err = exception.New(exception.IllegalPhoneNumber)
  45. return
  46. }
  47. err = auth.CheckUser(loginReq.Mobile, loginReq.VerifyCode)
  48. if err != nil {
  49. a.FailedResult("登录失败", result)
  50. logger.Warn("验证码校验失败:%v", err)
  51. return
  52. }
  53. userInfo := a.Ctx.Input.GetData("user").(user.User)
  54. //注册用户或者登录
  55. var token string
  56. err = auth.BindMobile(userInfo.Id, loginReq.Mobile, loginReq.AreaCode)
  57. fmt.Println(token)
  58. if err != nil {
  59. a.FailedResult("登录失败", result)
  60. return
  61. }
  62. a.SuccessResult("登录成功", &LoginResp{
  63. //Token: token,
  64. }, result)
  65. return
  66. })
  67. }
  68. type LoginResp struct {
  69. Token string
  70. }
  71. // SmsCodeReq 获取验证码请求
  72. type SmsCodeReq struct {
  73. Mobile string `json:"mobile"`
  74. AreaCode string `json:"areaCode"`
  75. }
  76. // SMSCode 小程序手机验证码接口
  77. // @Summary 获取手机验证码
  78. // @Param mobile body SmsCodeReq true "小程序手机验证码接口"
  79. // @Success 200 {object} controllers.BaseResponse
  80. // @Description 用户发送手机验证码
  81. // @router /sendCode [post]
  82. func (a *AuthController) SMSCode() {
  83. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  84. result = a.InitWrapData("发送短信失败")
  85. mobile := new(SmsCodeReq)
  86. a.GetPostParams(mobile)
  87. if mobile.AreaCode == "" || !checkValidAreaCode(mobile.AreaCode) {
  88. a.FailedResult("登录失败", result)
  89. err = exception.New(exception.IllegalAreaCode)
  90. return
  91. }
  92. phoneNum := mobile.Mobile
  93. if mobile.AreaCode == ChinaAreaCode && !authUtils.IsValidMobile(phoneNum) {
  94. return result, exception.New(exception.IllegalPhoneNumber)
  95. }
  96. //发送短息
  97. err = auth.SendSMSCode(phoneNum)
  98. if err != nil {
  99. logger.Warn("发送短信失败:%v", err)
  100. return result, err
  101. }
  102. if err != nil {
  103. return result, err
  104. }
  105. result = &controllers.WrapData{Msg: "验证码发送成功"}
  106. return result, nil
  107. })
  108. }
  109. type RefreshTokenRes struct {
  110. Token string `json:"token"`
  111. IsBindMobile int `json:"isBindMobile"`
  112. }
  113. // RefreshToken 更新token
  114. // @Summary 更新token
  115. // @Success 200 {object} controllers.BaseResponse
  116. // @Description 更新token
  117. // @router /refreshToken [get]
  118. func (a *AuthController) RefreshToken(code string) {
  119. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  120. result = a.InitWrapData("刷新token失败")
  121. if code == "" {
  122. logger.Error("code不能为空")
  123. return result, exception.New(exception.WeChatCodeEmpty)
  124. }
  125. //刷新token
  126. token, isBindMobile, err := auth.RefreshToken(code)
  127. if err != nil {
  128. logger.Error("刷新token失败:%v", err)
  129. a.FailedResult("刷新token失败", result)
  130. return
  131. }
  132. a.SuccessResult("刷新token成功", RefreshTokenRes{
  133. Token: token,
  134. IsBindMobile: isBindMobile,
  135. }, result)
  136. return
  137. })
  138. }
  139. // AreaCodes 小程序手机验证码接口
  140. // @Summary 获取手机验证码
  141. // @Param mobile body SmsCodeReq true "小程序手机验证码接口"
  142. // @Success 200 {object} controllers.BaseResponse
  143. // @Description 用户发送手机验证码
  144. // @router /areaCodes [get]
  145. func (a *AuthController) AreaCodes() {
  146. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  147. result = a.InitWrapData("获取区号失败")
  148. list, err := auth.GetAreaCodes()
  149. if err != nil {
  150. a.FailedResult("获取区号失败", result)
  151. }
  152. a.SuccessResult("获取区号成功", list, result)
  153. return
  154. })
  155. }
  156. type WXAppidResp struct {
  157. AppId string
  158. }
  159. // WXAppid 获取APPID
  160. // @Summary 获取APPID
  161. // @Success 200 {object} controllers.BaseResponse
  162. // @Description 获取APPID
  163. // @router /wxAppid [get]
  164. func (a *AuthController) WXAppid() {
  165. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  166. result = a.InitWrapData("获取AppId失败")
  167. appid := config.GetConfig(contants.WECHAT).(*config.WechatConfig).GetAppid()
  168. if err != nil {
  169. a.FailedResult("获取AppId失败", result)
  170. }
  171. a.SuccessResult("获取AppId成功", WXAppidResp{
  172. AppId: appid,
  173. }, result)
  174. return
  175. })
  176. }
  177. type FileResp struct {
  178. Content string
  179. }
  180. // Notice 获取注册须知
  181. // @Summary 获取注册须知
  182. // @Success 200 {object} controllers.BaseResponse
  183. // @Description 获取注册须知
  184. // @router /notice [get]
  185. func (a *AuthController) Notice() {
  186. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  187. result = a.InitWrapData("获取注册须知失败")
  188. fileConfig := config.GetConfig(contants.FILE).(*config.FileConfig)
  189. //publicKey := config.GetConfig(contants.FILE).(*config.FileConfig).GetPublicKey()
  190. noticeFile := fileConfig.GetNotice()
  191. content, err := readTextConfig(noticeFile)
  192. if err != nil {
  193. err = exception.New(exception.GetNoticeFileError)
  194. a.FailedResult("获取注册须知失败", result)
  195. }
  196. a.SuccessResult("获取注册须知成功", FileResp{
  197. Content: content,
  198. }, result)
  199. return
  200. })
  201. }
  202. // Disclaimer 获取免责声明
  203. // @Summary 获取免责声明
  204. // @Success 200 {object} controllers.BaseResponse
  205. // @Description 获取免责声明
  206. // @router /disclaimer [get]
  207. func (a *AuthController) Disclaimer() {
  208. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  209. result = a.InitWrapData("获取免责声明失败")
  210. fileConfig := config.GetConfig(contants.FILE).(*config.FileConfig)
  211. //publicKey := config.GetConfig(contants.FILE).(*config.FileConfig).GetPublicKey()
  212. disclaimerFile := fileConfig.GetDisclaimer()
  213. content, err := readTextConfig(disclaimerFile)
  214. if err != nil {
  215. a.FailedResult("获取免责声明失败", result)
  216. }
  217. a.SuccessResult("获取免责声明成功", FileResp{
  218. Content: content,
  219. }, result)
  220. return
  221. })
  222. }
  223. // 读取纯文本文件
  224. func readTextConfig(filename string) (content string, err error) {
  225. file, err := os.Open(filename)
  226. if err != nil {
  227. return "", err
  228. }
  229. defer file.Close()
  230. scanner := bufio.NewScanner(file)
  231. scanner.Split(bufio.ScanLines)
  232. var lines []string
  233. for scanner.Scan() {
  234. line := scanner.Text()
  235. lines = append(lines, line)
  236. }
  237. err = scanner.Err()
  238. return strings.Join(lines, "\n"), nil
  239. }
  240. func checkValidAreaCode(areaCode string) bool {
  241. list := auth.GetValidAreaCodes()
  242. if areaCode == "" || len(list) == 0 {
  243. return false
  244. }
  245. for _, code := range list {
  246. if areaCode == code {
  247. return true
  248. }
  249. }
  250. return false
  251. }