UserRouter.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. package router
  2. import (
  3. "demo/configs"
  4. "demo/data/dao"
  5. "demo/data/dao/manage"
  6. "demo/data/domain"
  7. "demo/data/domain/vo"
  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. "strings"
  20. "time"
  21. )
  22. func UserRouth(engine *gin.RouterGroup) {
  23. user := engine.Group("/user")
  24. PushRouter(user, "GET", "/info", GetUserInfo)
  25. //获取用户钱包
  26. PushRouter(user, "GET", "/wallet", GetUserWallet)
  27. //修改名字
  28. PushRouter(user, "PUT", "/name", SetNameValue)
  29. //获取用户的订单信息
  30. PushRouter(user, "POST", "/order", GetUserOrder)
  31. //用户登录
  32. PushRouter(user, "POST", "/login", login)
  33. //发送手机验证码 ,模拟
  34. PushRouter(user, "POST", "/loginCode", SendPhoneCode)
  35. //注册
  36. PushRouter(user, "POST", "/register", register)
  37. //发送邮箱注册验证码
  38. PushRouter(user, "POST", "/registerCode", registerCode)
  39. //图片验证码
  40. PushRouter(user, "GET", "/captcha", VerificationCode)
  41. //发送验证码
  42. PushRouter(user, "POST", "/sendSms", SendLoginVerificationCode)
  43. PushRouter(user, "GET", "/base/info", GetUserBaseInfo)
  44. PushRouter(user, "POST", "/base/info", GetUserBaseInfoList)
  45. }
  46. func SendPhoneCode(c *gin.Context) {
  47. data := share.GetJsonAnyParam(c)
  48. var err error
  49. phone, _ := data("phone")
  50. if phone == "" {
  51. c.JSON(200, CreateResultError(401, "参数不全"))
  52. return
  53. }
  54. // 定义正则表达式
  55. regexPattern := `^1[3-9][0-9]{9}$`
  56. // 编译正则表达式
  57. reg, err := regexp.Compile(regexPattern)
  58. if err != nil {
  59. fmt.Println("Error compiling regex:", err)
  60. return
  61. }
  62. matched := reg.MatchString(cast.ToString(phone))
  63. if !matched {
  64. c.JSON(200, CreateResultError(401, "手机号格式错误"))
  65. return
  66. }
  67. user, err := dao.GetUserByPhone(cast.ToString(phone))
  68. if err != nil {
  69. c.JSON(200, CreateResultError(401, "手机号未绑定邮箱"))
  70. return
  71. }
  72. //user.Email
  73. code := testSendMail(user.Email)
  74. //查看是否已经发送过验证码了
  75. exists := configs.RedisDb.Exists(ctx, "PhoneLoginVerificationCodeTime_"+cast.ToString(phone))
  76. if exists.Val() == 1 {
  77. c.JSON(http.StatusOK, CreateResultError(200, "验证码已经发送,请等待"))
  78. return
  79. }
  80. set := configs.RedisDb.Set(ctx, "PhoneLoginVerificationCode_"+cast.ToString(phone), code, 5*60*time.Second)
  81. configs.RedisDb.Set(ctx, "PhoneLoginVerificationCodeTime_"+cast.ToString(phone), code, 60*time.Second)
  82. if set.Err() != nil {
  83. c.JSON(200, CreateResultError(401, "发送失败"))
  84. return
  85. }
  86. c.JSON(200, CreateResult())
  87. }
  88. func GetUserBaseInfo(c *gin.Context) {
  89. id := c.Query("userId")
  90. if id == "" {
  91. c.JSON(200, CreateResultError(401, "参数不全"))
  92. return
  93. }
  94. user, err := manage.GetUserById(cast.ToInt64(id))
  95. if err != nil {
  96. c.JSON(200, CreateResultError(401, "用户不存在"))
  97. return
  98. }
  99. m := make(map[string]interface{})
  100. m["id"] = user.Id
  101. m["name"] = user.Name
  102. m["avatar"] = user.Avatar
  103. c.JSON(200, CreateResultData(m))
  104. }
  105. func GetUserBaseInfoList(c *gin.Context) {
  106. data := share.GetJsonAnyParam(c)
  107. idsData, _ := data("ids")
  108. split := strings.Split(cast.ToString(idsData), ",")
  109. var ids = make([]int64, 0)
  110. for i := range split {
  111. parseInt, _ := strconv.ParseInt(split[i], 10, 64)
  112. ids = append(ids, parseInt)
  113. }
  114. users, err := manage.GetUserListInId(ids)
  115. if err != nil {
  116. c.JSON(200, CreateResultError(401, "用户不存在"))
  117. return
  118. }
  119. vos := make([]vo.UserBaseInfoVo, 0)
  120. for i := range users {
  121. user := vo.UserBaseInfoVo{
  122. Id: users[i].Id,
  123. Name: users[i].Name,
  124. Avatar: users[i].Avatar,
  125. }
  126. vos = append(vos, user)
  127. }
  128. c.JSON(200, CreateResultData(vos))
  129. }
  130. // GetUserInfo 获取用户的个人信息
  131. func GetUserInfo(c *gin.Context) {
  132. header := c.GetHeader("auth-sign")
  133. if header == "" || header == "null" {
  134. c.JSON(200, CreateResultError(401, "用户未登录"))
  135. return
  136. }
  137. claims, err := share.ParseToken(header)
  138. if err != nil {
  139. c.JSON(200, CreateResultError(401, "用户未登录"))
  140. return
  141. }
  142. var userInfo = domain.User{}
  143. _, err = configs.Engine.Table("user").Where("id = ?", claims["iss"]).Get(&userInfo)
  144. if err != nil {
  145. c.JSON(200, CreateResultError(401, "用户未登录"))
  146. return
  147. }
  148. c.JSON(200, CreateResultData(userInfo))
  149. }
  150. func GetUserWallet(c *gin.Context) {
  151. id := GetUserIdByToken(c)
  152. if id == 0 {
  153. return
  154. }
  155. var vo vo.UserWalletVo
  156. userWallet, err := dao.GetUserWalletByUserId(id)
  157. if err != nil {
  158. c.JSON(200, CreateResultError(500, "获取钱包失败"))
  159. return
  160. }
  161. vo.Wallet = userWallet
  162. vo.CouponUserJDM, err = dao.GetUserCouponByUserId(id)
  163. if err != nil {
  164. c.JSON(200, CreateResultError(500, "获取优惠券失败"))
  165. return
  166. }
  167. c.JSON(200, CreateResultData(vo))
  168. }
  169. func SetNameValue(c *gin.Context) {
  170. id := GetUserIdByToken(c)
  171. if id == 0 {
  172. return
  173. }
  174. name := c.Query("name")
  175. fmt.Println(name)
  176. _, b, err := manage.SetUser(map[string]interface{}{"name": name}, id)
  177. if err != nil {
  178. println(err.Error())
  179. c.JSON(200, CreateResultError(500, "修改失败"))
  180. return
  181. }
  182. if b {
  183. c.JSON(200, CreateResult())
  184. } else {
  185. c.JSON(200, CreateResultError(500, "修改失败"))
  186. }
  187. }
  188. // GetUserOrder 获取用户订单信息
  189. func GetUserOrder(c *gin.Context) {
  190. id := GetUserIdByToken(c)
  191. if id == 0 {
  192. return
  193. }
  194. data := share.GetJsonAnyParam(c)
  195. pageNum, _ := data("pageNum")
  196. pageSize, _ := data("pageSize")
  197. state, _ := data("state")
  198. vo, err := dao.GetListGoodsOrder(cast.ToString(state), id, cast.ToInt(pageNum), cast.ToInt(pageSize))
  199. if err != nil {
  200. c.JSON(200, CreateResultError(500, "获取订单失败"))
  201. return
  202. }
  203. c.JSON(200, CreateResultData(vo))
  204. }
  205. // VerificationCode 图片验证码
  206. func VerificationCode(c *gin.Context) {
  207. // 配置
  208. driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.5, 80)
  209. store := base64Captcha.DefaultMemStore
  210. captcha := base64Captcha.NewCaptcha(driver, store)
  211. // 生成验证码
  212. id, b64s, answer, err := captcha.Generate()
  213. if err != nil {
  214. c.JSON(500, gin.H{"error": err.Error()})
  215. return
  216. }
  217. err = configs.RedisDb.Set(ctx, "VerificationCode_"+id, answer, 0).Err()
  218. if err != nil {
  219. fmt.Println(err)
  220. }
  221. err = configs.RedisDb.Expire(ctx, "VerificationCode_"+id, 60*time.Second).Err()
  222. if err != nil {
  223. panic(err)
  224. }
  225. // 返回验证码图片
  226. c.JSON(200, gin.H{
  227. "message": "获取成功!!!",
  228. "expires": time.Now().Add(time.Minute * 5).Unix(),
  229. "code": 200,
  230. "data": map[string]string{"id": id, "image": b64s},
  231. })
  232. }
  233. func login(c *gin.Context) {
  234. data := share.GetJsonAnyParam(c)
  235. var user domain.User
  236. username, _ := data("username")
  237. password, _ := data("password")
  238. t, _ := data("type")
  239. // 定义正则表达式
  240. if cast.ToString(t) == "email" {
  241. regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  242. // 编译正则表达式
  243. reg, err := regexp.Compile(regexPattern)
  244. if err != nil {
  245. fmt.Println("编译正则表达式时出错:", err)
  246. return
  247. }
  248. //判断是否为邮箱格式
  249. matched := reg.MatchString(cast.ToString(username))
  250. if !matched {
  251. fmt.Println("无效的电子邮件格式.")
  252. c.JSON(http.StatusOK, CreateResultError(400, "邮箱格式错误!!!"))
  253. return
  254. }
  255. user, err = dao.Logins(cast.ToString(username), cast.ToString(password), cast.ToString(t))
  256. if err == nil && user.Id != 0 {
  257. fmt.Println("用户登录成功!!!")
  258. token, err := share.GenerateToken(cast.ToString(user.Id))
  259. if err == nil {
  260. c.Header("auth-sign", token)
  261. c.JSON(http.StatusOK, CreateResultData(map[string]string{"token": token}))
  262. } else {
  263. c.JSON(http.StatusOK, CreateResultError(400, "生成token失败!!!"))
  264. }
  265. } else {
  266. fmt.Println("用户登录失败!!!")
  267. c.JSON(http.StatusOK, CreateResultError(401, "用户密码错误!!!"))
  268. }
  269. return
  270. } else if cast.ToString(t) == "phone" {
  271. regexPattern := `^1[3-9]\d{9}$`
  272. // 编译正则表达式
  273. reg, err := regexp.Compile(regexPattern)
  274. if err != nil {
  275. fmt.Println("编译正则表达式时出错:", err)
  276. return
  277. }
  278. //判断是否为邮箱格式
  279. matched := reg.MatchString(cast.ToString(username))
  280. if !matched {
  281. fmt.Println("无效的手机号格式.")
  282. c.JSON(http.StatusOK, CreateResultError(400, "手机格式错误!!!"))
  283. return
  284. }
  285. //获取用户数据
  286. user, err := dao.GetUserByPhone(cast.ToString(username))
  287. if err != nil {
  288. fmt.Println(err)
  289. c.JSON(http.StatusOK, CreateResultError(400, "用户未绑定邮箱"))
  290. }
  291. //发送邮件
  292. result, err := configs.RedisDb.Get(ctx, "PhoneLoginVerificationCode_"+user.Phone).Result()
  293. if err != nil {
  294. fmt.Println(err)
  295. c.JSON(http.StatusOK, CreateResultError(400, "验证码已过期"))
  296. return
  297. }
  298. if result == cast.ToString(password) {
  299. configs.RedisDb.Del(ctx, "PhoneLoginVerificationCode_"+user.Phone)
  300. //登录成功
  301. fmt.Println("用户登录成功!!!")
  302. token, err := share.GenerateToken(cast.ToString(user.Id))
  303. if err == nil {
  304. c.Header("auth-sign", token)
  305. c.JSON(http.StatusOK, CreateResultData(map[string]string{"token": token}))
  306. return
  307. } else {
  308. c.JSON(http.StatusOK, CreateResultError(400, "生成token失败!!!"))
  309. return
  310. }
  311. } else {
  312. c.JSON(http.StatusOK, CreateResultError(400, "验证码错误!!!"))
  313. return
  314. }
  315. }
  316. c.JSON(http.StatusOK, CreateResultError(400, "未知错误!!!"))
  317. }
  318. func registerCode(c *gin.Context) {
  319. data := share.GetJsonAnyParam(c)
  320. phone, _ := data("phone")
  321. email, _ := data("email")
  322. //判断是否为手机格式
  323. if !checkPhone(c, cast.ToString(phone)) {
  324. return
  325. }
  326. //判断是否已经注册
  327. b, err := dao.ExistsPhone(cast.ToString(phone))
  328. if err != nil {
  329. fmt.Println(err)
  330. c.JSON(http.StatusOK, CreateResultError(200, "数据库错误!"))
  331. return
  332. }
  333. if b {
  334. c.JSON(http.StatusOK, CreateResultError(200, "手机号已注册!!!"))
  335. return
  336. }
  337. //判断是否已经注册
  338. b, err = dao.ExistsEmail(cast.ToString(email))
  339. if err != nil {
  340. fmt.Println(err)
  341. c.JSON(http.StatusOK, CreateResultError(200, "数据库错误!"))
  342. return
  343. }
  344. if b {
  345. c.JSON(http.StatusOK, CreateResultError(200, "邮箱已注册!!!"))
  346. return
  347. }
  348. //判断是否重复注册
  349. get := configs.RedisDb.Exists(ctx, "PhoneVerificationCodeTime_"+cast.ToString(phone))
  350. if get.Val() == 1 {
  351. c.JSON(http.StatusOK, CreateResultError(200, "验证码已经发送,请等待"))
  352. return
  353. }
  354. //发送短信
  355. //sms := sendSms(b, cast.ToString(phone))
  356. //TODO 模拟发送短信
  357. //sms := testSendSms()
  358. sms := testSendSms(cast.ToString(email))
  359. fmt.Println("发送成功!!!:验证码为:", sms)
  360. //五分钟有效期
  361. configs.RedisDb.Set(ctx, "PhoneVerificationCode_"+cast.ToString(phone), sms, 60*5*time.Second)
  362. //60秒有效期
  363. configs.RedisDb.Set(ctx, "PhoneVerificationCodeTime_"+cast.ToString(phone), time.Now(), 5*time.Second)
  364. c.JSON(http.StatusOK, CreateResult())
  365. }
  366. func testSendSms(email string) string {
  367. mins := big.NewInt(100000)
  368. maxs := big.NewInt(999999)
  369. randomNum := share.RandomInt(mins, maxs)
  370. sms := randomNum.String()
  371. go SendEmail(cast.ToString(email), fmt.Sprint("您的验证码为:", sms))
  372. //if matched {
  373. // //bools, err = configs.Engine.Table("user").Where("username = ?", username).Exist(&user)
  374. //
  375. // share.SendMail(username, strconv.Itoa(int(randomNum.Int64())))
  376. //
  377. //} else {
  378. // share.SendSms(strconv.Itoa(int(randomNum.Int64())), username)
  379. //}
  380. return sms
  381. }
  382. func testSendMail(email string) string {
  383. mins := big.NewInt(100000)
  384. maxs := big.NewInt(999999)
  385. randomNum := share.RandomInt(mins, maxs)
  386. //if matched {
  387. // //bools, err = configs.Engine.Table("user").Where("username = ?", username).Exist(&user)
  388. //
  389. share.SendMail(email, strconv.Itoa(int(randomNum.Int64())))
  390. //
  391. //} else {
  392. // share.SendSms(strconv.Itoa(int(randomNum.Int64())), username)
  393. //}
  394. return randomNum.String()
  395. }
  396. func SendEmail(to, content string) {
  397. util.SendMail("用户注册验证码", content, to)
  398. }
  399. func register(c *gin.Context) {
  400. data := share.GetJsonAnyParam(c)
  401. username, _ := data("username")
  402. password, _ := data("password")
  403. code, _ := data("code")
  404. phone, _ := data("phone")
  405. if !checkEmail(c, cast.ToString(username)) {
  406. return
  407. }
  408. if !checkPhone(c, cast.ToString(phone)) {
  409. return
  410. }
  411. if !checkCode(c, cast.ToString(code)) {
  412. return
  413. }
  414. if !checkPassword(c, cast.ToString(password)) {
  415. return
  416. }
  417. // 验证验证码
  418. get := configs.RedisDb.Get(ctx, "PhoneVerificationCode_"+cast.ToString(phone))
  419. fmt.Println(code, get.Val())
  420. if code != get.Val() {
  421. c.JSON(http.StatusOK, CreateResultError(400, "验证码错误!"))
  422. return
  423. }
  424. configs.RedisDb.Del(ctx, "PhoneVerificationCode_"+cast.ToString(phone))
  425. //判断是否已经注册
  426. b, err := dao.GetUserByPhoneOrEmail(cast.ToString(phone), cast.ToString(username))
  427. if err != nil {
  428. c.JSON(http.StatusOK, CreateResultError(400, "验证手机号及用户名,数据错误"))
  429. return
  430. }
  431. if b {
  432. c.JSON(http.StatusOK, CreateResultError(400, "手机号或邮箱已注册!!!"))
  433. return
  434. }
  435. timestamp := time.Now().Unix()
  436. user := domain.User{
  437. Username: cast.ToString(username),
  438. Password: cast.ToString(password),
  439. CreationTime: timestamp,
  440. Status: "0",
  441. RoleId: 2,
  442. Phone: cast.ToString(phone),
  443. Email: cast.ToString(username),
  444. Name: cast.ToString(username),
  445. RecommendCode: fmt.Sprint(strconv.FormatInt(timestamp, 16), util.RandomArrays(13, 62)),
  446. }
  447. user, err = dao.SaveNewUser(user)
  448. if err != nil {
  449. fmt.Println(err)
  450. c.JSON(http.StatusOK, CreateResultError(400, "数据库错误!!!"))
  451. return
  452. }
  453. if user.Id != 0 {
  454. fmt.Println("用户注册成功!!!")
  455. c.JSON(http.StatusOK, CreateResultData(map[string]any{"user": user}))
  456. //用户钱包添加
  457. manage.SaveUserWallet(&domain.UserWallet{UserId: user.Id})
  458. return
  459. } else {
  460. fmt.Println("用户注册失败!!!")
  461. c.JSON(http.StatusOK, CreateResultError(400, "用户注册失败!!!"))
  462. return
  463. }
  464. }
  465. // SendLoginVerificationCode 发送手机验证码,模拟邮箱验证码
  466. func SendLoginVerificationCode(c *gin.Context) {
  467. data := share.GetJsonAnyParam(c)
  468. var err error
  469. username, _ := data("username")
  470. code, _ := data("code")
  471. codeId, _ := data("codeId")
  472. val, err := configs.RedisDb.Get(ctx, cast.ToString(codeId)).Result()
  473. if err != nil {
  474. log.Fatal(err)
  475. }
  476. if val != cast.ToString(code) {
  477. c.JSON(200, gin.H{"code": 400, "message": "验证码错误!!!"})
  478. c.Abort()
  479. return
  480. }
  481. // 定义正则表达式
  482. regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  483. // 编译正则表达式
  484. reg, err := regexp.Compile(regexPattern)
  485. if err != nil {
  486. fmt.Println("Error compiling regex:", err)
  487. return
  488. }
  489. matched := reg.MatchString(cast.ToString(username))
  490. dao.SendSms(matched, cast.ToString(username))
  491. c.JSON(200, gin.H{"code": 200, "message": "发送成功!!!"})
  492. }
  493. //==================================================================================================
  494. //==================================================================================================
  495. //==================================================================================================
  496. func checkEmail(c *gin.Context, email string) bool {
  497. //// 定义正则表达式
  498. regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
  499. reg, err := regexp.Compile(regexPattern)
  500. if err != nil {
  501. fmt.Println("Error compiling regex:", err)
  502. c.JSON(500, CreateResultError(500, "邮箱格式错误!!!"))
  503. return false
  504. }
  505. //判断是否为邮箱格式
  506. matched := reg.MatchString(cast.ToString(email))
  507. if !matched {
  508. fmt.Println("Error compiling regex:", err)
  509. c.JSON(500, CreateResultError(500, "邮箱格式错误!!!"))
  510. return false
  511. }
  512. return true
  513. }
  514. func checkPhone(c *gin.Context, phone string) bool {
  515. //// 定义正则表达式
  516. regexPattern := `^1[3-9]\d{9}$`
  517. reg, err := regexp.Compile(regexPattern)
  518. if err != nil {
  519. fmt.Println("1 Error compiling regex:", err)
  520. c.JSON(200, CreateResultError(500, "手机号格式错误!!!"))
  521. return false
  522. }
  523. matched := reg.MatchString(cast.ToString(phone))
  524. if !matched {
  525. fmt.Println("2 Error compiling regex:", err)
  526. c.JSON(200, CreateResultError(500, "手机号格式错误!!!"))
  527. return false
  528. }
  529. return true
  530. }
  531. func checkPassword(c *gin.Context, email string) bool {
  532. //// 定义正则表达式
  533. regexPattern := `^[a-zA-Z0-9,./<>?;'\\:"|\[\]{}~!@#$%^&*()_+=-]{6,32}$`
  534. reg, err := regexp.Compile(regexPattern)
  535. if err != nil {
  536. fmt.Println("Error compiling regex:", err)
  537. c.JSON(500, CreateResultError(500, "密码格式错误!!!"))
  538. return false
  539. }
  540. //判断是否为邮箱格式
  541. matched := reg.MatchString(cast.ToString(email))
  542. if !matched {
  543. fmt.Println("Error compiling regex:", err)
  544. c.JSON(500, CreateResultError(500, "密码格式错误!!!"))
  545. return false
  546. }
  547. return true
  548. }
  549. func checkCode(c *gin.Context, code string) bool {
  550. //// 定义正则表达式
  551. regexPattern := `^\d{6}$`
  552. reg, err := regexp.Compile(regexPattern)
  553. if err != nil {
  554. fmt.Println("Error compiling regex:", err)
  555. c.JSON(500, CreateResultError(500, "验证码格式错误!!!"))
  556. return false
  557. }
  558. //判断是否为邮箱格式
  559. matched := reg.MatchString(cast.ToString(code))
  560. if !matched {
  561. fmt.Println("Error compiling regex:", err)
  562. c.JSON(500, CreateResultError(500, "验证码格式错误!!!"))
  563. return false
  564. }
  565. return true
  566. }