user.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package user
  2. import (
  3. "context"
  4. "demo/configs"
  5. "demo/router"
  6. "demo/share"
  7. "fmt"
  8. "github.com/gin-gonic/gin"
  9. "github.com/mojocn/base64Captcha"
  10. "github.com/spf13/cast"
  11. "log"
  12. "net/http"
  13. "regexp"
  14. "time"
  15. )
  16. var ctx = context.Background()
  17. func UserRouth(engine *gin.RouterGroup) {
  18. user := engine.Group("/user")
  19. {
  20. user.POST("/login", login)
  21. user.POST("/register", register)
  22. user.POST("sendSms", SendVerificationCode)
  23. user.GET("/captcha", VerificationCode)
  24. }
  25. }
  26. func VerificationCode(c *gin.Context) {
  27. // 配置
  28. driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.5, 80)
  29. store := base64Captcha.DefaultMemStore
  30. captcha := base64Captcha.NewCaptcha(driver, store)
  31. // 生成验证码
  32. id, b64s, answer, err := captcha.Generate()
  33. if err != nil {
  34. c.JSON(500, gin.H{"error": err.Error()})
  35. return
  36. }
  37. fmt.Println(answer)
  38. err = configs.RedisDb.Set(ctx, "VerificationCode_"+id, answer, 0).Err()
  39. if err != nil {
  40. fmt.Println(err)
  41. }
  42. err = configs.RedisDb.Expire(ctx, "VerificationCode_"+id, 60*time.Second).Err()
  43. if err != nil {
  44. panic(err)
  45. }
  46. // 返回验证码图片
  47. c.JSON(200, gin.H{
  48. "message": "获取成功!!!",
  49. "expires": time.Now().Add(time.Minute * 5).Unix(),
  50. "code": 200,
  51. "data": map[string]string{"id": id, "image": b64s},
  52. })
  53. }
  54. func login(c *gin.Context) {
  55. data := share.GetJsonAnyParam(c)
  56. var user configs.User
  57. var err error
  58. username, _ := data("username")
  59. password, _ := data("password")
  60. t, _ := data("type")
  61. // 定义正则表达式
  62. if cast.ToString(t) == "email" {
  63. regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  64. // 编译正则表达式
  65. reg, err := regexp.Compile(regexPattern)
  66. if err != nil {
  67. fmt.Println("编译正则表达式时出错:", err)
  68. return
  69. }
  70. //判断是否为邮箱格式
  71. matched := reg.MatchString(cast.ToString(username))
  72. if !matched {
  73. fmt.Println("无效的电子邮件格式.")
  74. c.JSON(http.StatusOK, router.CreateResultError(400, "邮箱格式错误!!!"))
  75. return
  76. }
  77. } else if cast.ToString(t) == "phone" {
  78. regexPattern := `^1[3-9]\d{9}$`
  79. // 编译正则表达式
  80. reg, err := regexp.Compile(regexPattern)
  81. if err != nil {
  82. fmt.Println("编译正则表达式时出错:", err)
  83. return
  84. }
  85. //判断是否为邮箱格式
  86. matched := reg.MatchString(cast.ToString(username))
  87. if !matched {
  88. fmt.Println("无效的手机号格式.")
  89. c.JSON(http.StatusOK, router.CreateResultError(400, "手机格式错误!!!"))
  90. return
  91. }
  92. }
  93. user, err = logins(cast.ToString(username), cast.ToString(password), cast.ToString(t))
  94. if err == nil && user.Id != 0 {
  95. fmt.Println("用户登录成功!!!")
  96. token, err := share.GenerateToken(cast.ToString(user.Id))
  97. if err == nil {
  98. c.Header("auth-sign", token)
  99. c.JSON(http.StatusOK, router.CreateResultData(map[string]string{"token": token}))
  100. } else {
  101. c.JSON(http.StatusOK, router.CreateResultError(400, "生成token失败!!!"))
  102. }
  103. } else {
  104. fmt.Println("用户登录失败!!!")
  105. c.JSON(http.StatusOK, router.CreateResultError(401, "用户密码错误!!!"))
  106. }
  107. }
  108. func register(c *gin.Context) {
  109. //data := share.GetJsonAnyParam(c)
  110. //var user configs.User
  111. //var err error
  112. //username, _ := data("username")
  113. //password, _ := data("password")
  114. //// 定义正则表达式
  115. //regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  116. //
  117. //// 编译正则表达式
  118. //reg, err := regexp.Compile(regexPattern)
  119. //if err != nil {
  120. // fmt.Println("Error compiling regex:", err)
  121. // return
  122. //}
  123. //判断是否为邮箱格式
  124. //matched := reg.MatchString(cast.ToString(username))
  125. //user, err = logins(cast.ToString(username), cast.ToString(password), matched)
  126. //
  127. //if err == nil && user.Id != 0 {
  128. // fmt.Println("用户登录成功!!!")
  129. // token, err := share.GenerateToken(cast.ToString(user.Id))
  130. // if err == nil {
  131. // c.Header("auth-sign", token)
  132. // c.JSON(http.StatusOK, router.CreateResult())
  133. // } else {
  134. // c.JSON(http.StatusOK, router.CreateResultError(400, "生成token失败!!!"))
  135. // }
  136. //} else {
  137. // fmt.Println("用户登录失败!!!")
  138. // c.JSON(http.StatusOK, router.CreateResultError(401, "用户密码错误!!!"))
  139. //}
  140. }
  141. // SendVerificationCode
  142. func SendVerificationCode(c *gin.Context) {
  143. data := share.GetJsonAnyParam(c)
  144. var err error
  145. username, _ := data("username")
  146. code, _ := data("code")
  147. codeId, _ := data("codeId")
  148. val, err := configs.RedisDb.Get(ctx, cast.ToString(codeId)).Result()
  149. if err != nil {
  150. log.Fatal(err)
  151. }
  152. if val != cast.ToString(code) {
  153. c.JSON(200, gin.H{"code": 400, "message": "验证码错误!!!"})
  154. c.Abort()
  155. return
  156. }
  157. // 定义正则表达式
  158. regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  159. // 编译正则表达式
  160. reg, err := regexp.Compile(regexPattern)
  161. if err != nil {
  162. fmt.Println("Error compiling regex:", err)
  163. return
  164. }
  165. matched := reg.MatchString(cast.ToString(username))
  166. sendSms(matched, cast.ToString(username))
  167. c.JSON(200, gin.H{"code": 200, "message": "发送成功!!!"})
  168. }