auth_controller.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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. "path/filepath"
  13. "strings"
  14. )
  15. type AuthController struct {
  16. controllers.BaseController
  17. }
  18. const ChinaAreaCode = "86"
  19. // LoginReq 获取验证码请求
  20. type LoginReq struct {
  21. Code string `json:"code"`
  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. //注册用户或者登录
  54. var token string
  55. token, err = auth.Login(auth.LoginDTO{
  56. VerifyCode: loginReq.VerifyCode,
  57. Code: loginReq.Code,
  58. Mobile: loginReq.Mobile,
  59. })
  60. if err != nil {
  61. a.FailedResult("登录失败", result)
  62. return
  63. }
  64. a.SuccessResult("登录成功", &LoginResp{
  65. Token: token,
  66. }, result)
  67. return
  68. })
  69. }
  70. type LoginResp struct {
  71. Token string
  72. }
  73. // SmsCodeReq 获取验证码请求
  74. type SmsCodeReq struct {
  75. Mobile string `json:"mobile"`
  76. AreaCode string `json:"areaCode"`
  77. }
  78. // SMSCode 小程序手机验证码接口
  79. // @Summary 获取手机验证码
  80. // @Param mobile body SmsCodeReq true "小程序手机验证码接口"
  81. // @Success 200 {object} controllers.BaseResponse
  82. // @Description 用户发送手机验证码
  83. // @router /sendCode [post]
  84. func (a *AuthController) SMSCode() {
  85. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  86. result = a.InitWrapData("发送短信失败")
  87. mobile := new(SmsCodeReq)
  88. a.GetPostParams(mobile)
  89. if mobile.AreaCode == "" || !checkValidAreaCode(mobile.AreaCode) {
  90. a.FailedResult("登录失败", result)
  91. err = exception.New(exception.IllegalAreaCode)
  92. return
  93. }
  94. phoneNum := mobile.Mobile
  95. if mobile.AreaCode == ChinaAreaCode && !authUtils.IsValidMobile(phoneNum) {
  96. return result, exception.New(exception.IllegalPhoneNumber)
  97. }
  98. //发送短息
  99. err = auth.SendSMSCode(phoneNum)
  100. if err != nil {
  101. logger.Warn("发送短信失败:%v", err)
  102. return result, err
  103. }
  104. if err != nil {
  105. return result, err
  106. }
  107. result = &controllers.WrapData{Msg: "验证码发送成功"}
  108. return result, nil
  109. })
  110. }
  111. type RefreshTokenRes struct {
  112. Token string `json:"token"`
  113. }
  114. // RefreshToken 更新token
  115. // @Summary 更新token
  116. // @Success 200 {object} controllers.BaseResponse
  117. // @Description 更新token
  118. // @router /refreshToken [get]
  119. func (a *AuthController) RefreshToken(code string) {
  120. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  121. result = a.InitWrapData("刷新token失败")
  122. if code == "" {
  123. logger.Error("code不能为空")
  124. return result, exception.New(exception.WeChatCodeEmpty)
  125. }
  126. //刷新token
  127. token, err := auth.RefreshToken(code)
  128. if err != nil {
  129. logger.Error("刷新token失败:%v", err)
  130. a.FailedResult("刷新token失败", result)
  131. return
  132. }
  133. a.SuccessResult("刷新token成功", RefreshTokenRes{
  134. Token: token,
  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. Name string
  179. Content string
  180. }
  181. // Notice 获取注册须知
  182. // @Summary 获取注册须知
  183. // @Success 200 {object} controllers.BaseResponse
  184. // @Description 获取注册须知
  185. // @router /notice [get]
  186. func (a *AuthController) Notice() {
  187. controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  188. result = a.InitWrapData("获取注册须知失败")
  189. rootDir, err := filepath.Abs(filepath.Dir(os.Args[0]))
  190. if err != nil {
  191. logger.Error("获取文件路径失败:%v", err)
  192. err = exception.New(exception.GetNoticeFileError)
  193. a.FailedResult("获取注册须知失败", result)
  194. return
  195. }
  196. //publicKey := config.GetConfig(contants.FILE).(*config.FileConfig).GetPublicKey()
  197. noticeFile := config.GetConfig(contants.FILE).(*config.FileConfig).GetNotice()
  198. filePath := filepath.Join(rootDir, "conf", noticeFile)
  199. content, err := readTextConfig(filePath)
  200. if err != nil {
  201. err = exception.New(exception.GetNoticeFileError)
  202. a.FailedResult("获取注册须知失败", result)
  203. }
  204. a.SuccessResult("获取注册须知成功", FileResp{
  205. Name: noticeFile,
  206. Content: content,
  207. }, result)
  208. return
  209. })
  210. }
  211. //// Disclaimer 获取免责声明
  212. //// @Summary 获取免责声明
  213. //// @Success 200 {object} controllers.BaseResponse
  214. //// @Description 获取免责声明
  215. //// @router /disclaimer [get]
  216. //func (a *AuthController) Disclaimer() {
  217. // controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
  218. // result = a.InitWrapData("获取免责声明失败")
  219. // publicKey := config.GetConfig(contants.FILE).(*config.FileConfig).GetPublicKey()
  220. // disclaimerFile = config.GetConfig(contants.FILE).(*config.FileConfig).GetDisclaimer()
  221. // appid := config.GetConfig(contants.WECHAT).(*config.WechatConfig).GetAppid()
  222. // if err != nil {
  223. // a.FailedResult("获取免责声明失败", result)
  224. // }
  225. // a.SuccessResult("获取免责声明成功", WXAppidResp{
  226. // AppId: appid,
  227. // }, result)
  228. // return
  229. // })
  230. //}
  231. // 读取纯文本文件
  232. func readTextConfig(filename string) (content string, err error) {
  233. file, err := os.Open(filename)
  234. if err != nil {
  235. return "", err
  236. }
  237. defer file.Close()
  238. scanner := bufio.NewScanner(file)
  239. scanner.Split(bufio.ScanLines)
  240. var lines []string
  241. for scanner.Scan() {
  242. line := scanner.Text()
  243. lines = append(lines, line)
  244. }
  245. err = scanner.Err()
  246. return strings.Join(lines, "\n"), nil
  247. }
  248. func checkValidAreaCode(areaCode string) bool {
  249. list := auth.GetValidAreaCodes()
  250. if areaCode == "" || len(list) == 0 {
  251. return false
  252. }
  253. for _, code := range list {
  254. if areaCode == code {
  255. return true
  256. }
  257. }
  258. return false
  259. }