user.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. package user
  2. import (
  3. "context"
  4. "demo/configs"
  5. "demo/data/dao/manage"
  6. "demo/data/domain"
  7. "demo/router"
  8. "demo/share"
  9. "demo/util"
  10. "fmt"
  11. "github.com/gin-gonic/gin"
  12. "github.com/mojocn/base64Captcha"
  13. "github.com/spf13/cast"
  14. "log"
  15. "math/big"
  16. "net/http"
  17. "regexp"
  18. "strconv"
  19. "time"
  20. )
  21. var ctx = context.Background()
  22. func UserRouth(engine *gin.RouterGroup) {
  23. user := engine.Group("/user")
  24. {
  25. user.POST("/login", login)
  26. user.POST("/register", register)
  27. user.POST("/registerCode", registerCode)
  28. user.POST("/sendSms", SendVerificationCode)
  29. user.GET("/captcha", VerificationCode)
  30. }
  31. }
  32. func VerificationCode(c *gin.Context) {
  33. // 配置
  34. driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.5, 80)
  35. store := base64Captcha.DefaultMemStore
  36. captcha := base64Captcha.NewCaptcha(driver, store)
  37. // 生成验证码
  38. id, b64s, answer, err := captcha.Generate()
  39. if err != nil {
  40. c.JSON(500, gin.H{"error": err.Error()})
  41. return
  42. }
  43. fmt.Println(answer)
  44. err = configs.RedisDb.Set(ctx, "VerificationCode_"+id, answer, 0).Err()
  45. if err != nil {
  46. fmt.Println(err)
  47. }
  48. err = configs.RedisDb.Expire(ctx, "VerificationCode_"+id, 60*time.Second).Err()
  49. if err != nil {
  50. panic(err)
  51. }
  52. // 返回验证码图片
  53. c.JSON(200, gin.H{
  54. "message": "获取成功!!!",
  55. "expires": time.Now().Add(time.Minute * 5).Unix(),
  56. "code": 200,
  57. "data": map[string]string{"id": id, "image": b64s},
  58. })
  59. }
  60. func login(c *gin.Context) {
  61. data := share.GetJsonAnyParam(c)
  62. var user configs.User
  63. var err error
  64. username, _ := data("username")
  65. password, _ := data("password")
  66. t, _ := data("type")
  67. // 定义正则表达式
  68. if cast.ToString(t) == "email" {
  69. regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  70. // 编译正则表达式
  71. reg, err := regexp.Compile(regexPattern)
  72. if err != nil {
  73. fmt.Println("编译正则表达式时出错:", err)
  74. return
  75. }
  76. //判断是否为邮箱格式
  77. matched := reg.MatchString(cast.ToString(username))
  78. if !matched {
  79. fmt.Println("无效的电子邮件格式.")
  80. c.JSON(http.StatusOK, router.CreateResultError(400, "邮箱格式错误!!!"))
  81. return
  82. }
  83. } else if cast.ToString(t) == "phone" {
  84. regexPattern := `^1[3-9]\d{9}$`
  85. // 编译正则表达式
  86. reg, err := regexp.Compile(regexPattern)
  87. if err != nil {
  88. fmt.Println("编译正则表达式时出错:", err)
  89. return
  90. }
  91. //判断是否为邮箱格式
  92. matched := reg.MatchString(cast.ToString(username))
  93. if !matched {
  94. fmt.Println("无效的手机号格式.")
  95. c.JSON(http.StatusOK, router.CreateResultError(400, "手机格式错误!!!"))
  96. return
  97. }
  98. }
  99. user, err = logins(cast.ToString(username), cast.ToString(password), cast.ToString(t))
  100. if err == nil && user.Id != 0 {
  101. fmt.Println("用户登录成功!!!")
  102. token, err := share.GenerateToken(cast.ToString(user.Id))
  103. if err == nil {
  104. c.Header("auth-sign", token)
  105. c.JSON(http.StatusOK, router.CreateResultData(map[string]string{"token": token}))
  106. } else {
  107. c.JSON(http.StatusOK, router.CreateResultError(400, "生成token失败!!!"))
  108. }
  109. } else {
  110. fmt.Println("用户登录失败!!!")
  111. c.JSON(http.StatusOK, router.CreateResultError(401, "用户密码错误!!!"))
  112. }
  113. }
  114. func registerCode(c *gin.Context) {
  115. data := share.GetJsonAnyParam(c)
  116. phone, _ := data("phone")
  117. //判断是否为手机格式
  118. if !checkPhone(c, cast.ToString(phone)) {
  119. return
  120. }
  121. //判断是否已经注册
  122. b, err := existsPhone(cast.ToString(phone))
  123. if err != nil {
  124. fmt.Println(err)
  125. c.JSON(http.StatusOK, router.CreateResultError(200, "数据库错误!!!"))
  126. return
  127. }
  128. if b {
  129. c.JSON(http.StatusOK, router.CreateResultError(200, "手机号已注册!!!"))
  130. return
  131. }
  132. //判断是否重复注册
  133. get := configs.RedisDb.Exists(ctx, "PhoneVerificationCodeTime_"+cast.ToString(phone))
  134. if get.Val() == 1 {
  135. c.JSON(http.StatusOK, router.CreateResultError(200, "验证码已经发送,请等待"))
  136. return
  137. }
  138. //发送短信
  139. //sms := sendSms(b, cast.ToString(phone))
  140. //TODO 模拟发送短信
  141. sms := testSendSms()
  142. fmt.Println("发送成功!!!:验证码为:", sms)
  143. configs.RedisDb.Set(ctx, "PhoneVerificationCode_"+cast.ToString(phone), sms, 60*5*time.Second)
  144. configs.RedisDb.Set(ctx, "PhoneVerificationCodeTime_"+cast.ToString(phone), time.Now(), 60*time.Second)
  145. c.JSON(http.StatusOK, router.CreateResult())
  146. }
  147. func testSendSms() string {
  148. mins := big.NewInt(100000)
  149. maxs := big.NewInt(999999)
  150. randomNum := share.RandomInt(mins, maxs)
  151. //if matched {
  152. // //bools, err = configs.Engine.Table("user").Where("username = ?", username).Exist(&user)
  153. //
  154. // share.SendMail(username, strconv.Itoa(int(randomNum.Int64())))
  155. //
  156. //} else {
  157. // share.SendSms(strconv.Itoa(int(randomNum.Int64())), username)
  158. //}
  159. return randomNum.String()
  160. }
  161. func register(c *gin.Context) {
  162. data := share.GetJsonAnyParam(c)
  163. username, _ := data("username")
  164. password, _ := data("password")
  165. code, _ := data("code")
  166. phone, _ := data("phone")
  167. if !checkEmail(c, cast.ToString(username)) {
  168. return
  169. }
  170. if !checkPhone(c, cast.ToString(phone)) {
  171. return
  172. }
  173. if !checkCode(c, cast.ToString(code)) {
  174. return
  175. }
  176. if !checkPassword(c, cast.ToString(password)) {
  177. return
  178. }
  179. // 验证验证码
  180. get := configs.RedisDb.Get(ctx, "PhoneVerificationCode_"+cast.ToString(phone))
  181. fmt.Println(code, get.Val())
  182. if code != get.Val() {
  183. c.JSON(http.StatusOK, router.CreateResultError(400, "验证码错误!"))
  184. return
  185. }
  186. configs.RedisDb.Del(ctx, "PhoneVerificationCode_"+cast.ToString(phone))
  187. //判断是否已经注册
  188. b, err := GetUserByPhoneOrEmail(cast.ToString(phone), cast.ToString(username))
  189. if err != nil {
  190. c.JSON(http.StatusOK, router.CreateResultError(400, "验证手机号及用户名,数据错误"))
  191. return
  192. }
  193. if b {
  194. c.JSON(http.StatusOK, router.CreateResultError(400, "手机号或邮箱已注册!!!"))
  195. return
  196. }
  197. timestamp := time.Now().Unix()
  198. user := configs.User{
  199. Username: cast.ToString(username),
  200. Password: cast.ToString(password),
  201. Creation_time: int(timestamp),
  202. Status: 0,
  203. Role_id: 2,
  204. Phone: cast.ToString(phone),
  205. Email: cast.ToString(username),
  206. Name: cast.ToString(username),
  207. RecommendCode: fmt.Sprint(strconv.FormatInt(timestamp, 16), util.RandomArrays(13, 62)),
  208. }
  209. user, err = SaveNewUser(user)
  210. if err != nil {
  211. fmt.Println(err)
  212. c.JSON(http.StatusOK, router.CreateResultError(400, "数据库错误!!!"))
  213. return
  214. }
  215. if user.Id != 0 {
  216. fmt.Println("用户注册成功!!!")
  217. c.JSON(http.StatusOK, router.CreateResultData(map[string]any{"user": user}))
  218. //用户钱包添加
  219. manage.SaveUserWallet(&domain.UserWallet{UserId: user.Id})
  220. return
  221. } else {
  222. fmt.Println("用户注册失败!!!")
  223. c.JSON(http.StatusOK, router.CreateResultError(400, "用户注册失败!!!"))
  224. return
  225. }
  226. }
  227. func checkEmail(c *gin.Context, email string) bool {
  228. //// 定义正则表达式
  229. regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  230. reg, err := regexp.Compile(regexPattern)
  231. if err != nil {
  232. fmt.Println("Error compiling regex:", err)
  233. c.JSON(500, router.CreateResultError(500, "邮箱格式错误!!!"))
  234. return false
  235. }
  236. //判断是否为邮箱格式
  237. matched := reg.MatchString(cast.ToString(email))
  238. if !matched {
  239. fmt.Println("Error compiling regex:", err)
  240. c.JSON(500, router.CreateResultError(500, "邮箱格式错误!!!"))
  241. return false
  242. }
  243. return true
  244. }
  245. func checkPhone(c *gin.Context, phone string) bool {
  246. //// 定义正则表达式
  247. regexPattern := `^1[3-9]\d{9}$`
  248. reg, err := regexp.Compile(regexPattern)
  249. if err != nil {
  250. fmt.Println("1 Error compiling regex:", err)
  251. c.JSON(200, router.CreateResultError(500, "手机号格式错误!!!"))
  252. return false
  253. }
  254. matched := reg.MatchString(cast.ToString(phone))
  255. if !matched {
  256. fmt.Println("2 Error compiling regex:", err)
  257. c.JSON(200, router.CreateResultError(500, "手机号格式错误!!!"))
  258. return false
  259. }
  260. return true
  261. }
  262. func checkPassword(c *gin.Context, email string) bool {
  263. //// 定义正则表达式
  264. regexPattern := `^[a-zA-Z0-9,./<>?;'\\:"|\[\]{}~!@#$%^&*()_+=-]{6,32}$`
  265. reg, err := regexp.Compile(regexPattern)
  266. if err != nil {
  267. fmt.Println("Error compiling regex:", err)
  268. c.JSON(500, router.CreateResultError(500, "密码格式错误!!!"))
  269. return false
  270. }
  271. //判断是否为邮箱格式
  272. matched := reg.MatchString(cast.ToString(email))
  273. if !matched {
  274. fmt.Println("Error compiling regex:", err)
  275. c.JSON(500, router.CreateResultError(500, "密码格式错误!!!"))
  276. return false
  277. }
  278. return true
  279. }
  280. func checkCode(c *gin.Context, code string) bool {
  281. //// 定义正则表达式
  282. regexPattern := `^\d{6}$`
  283. reg, err := regexp.Compile(regexPattern)
  284. if err != nil {
  285. fmt.Println("Error compiling regex:", err)
  286. c.JSON(500, router.CreateResultError(500, "验证码格式错误!!!"))
  287. return false
  288. }
  289. //判断是否为邮箱格式
  290. matched := reg.MatchString(cast.ToString(code))
  291. if !matched {
  292. fmt.Println("Error compiling regex:", err)
  293. c.JSON(500, router.CreateResultError(500, "验证码格式错误!!!"))
  294. return false
  295. }
  296. return true
  297. }
  298. // SendVerificationCode 发送验证码
  299. func SendVerificationCode(c *gin.Context) {
  300. data := share.GetJsonAnyParam(c)
  301. var err error
  302. username, _ := data("username")
  303. code, _ := data("code")
  304. codeId, _ := data("codeId")
  305. val, err := configs.RedisDb.Get(ctx, cast.ToString(codeId)).Result()
  306. if err != nil {
  307. log.Fatal(err)
  308. }
  309. if val != cast.ToString(code) {
  310. c.JSON(200, gin.H{"code": 400, "message": "验证码错误!!!"})
  311. c.Abort()
  312. return
  313. }
  314. // 定义正则表达式
  315. regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  316. // 编译正则表达式
  317. reg, err := regexp.Compile(regexPattern)
  318. if err != nil {
  319. fmt.Println("Error compiling regex:", err)
  320. return
  321. }
  322. matched := reg.MatchString(cast.ToString(username))
  323. sendSms(matched, cast.ToString(username))
  324. c.JSON(200, gin.H{"code": 200, "message": "发送成功!!!"})
  325. }