auth_controller.go 7.5 KB

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