user.go 10 KB

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