front.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package controller
  2. import (
  3. . "bindresume/config"
  4. "bindresume/service"
  5. "fmt"
  6. "github.com/google/uuid"
  7. "log"
  8. "net/http"
  9. "time"
  10. "github.com/gin-gonic/gin"
  11. _ "github.com/go-sql-driver/mysql"
  12. )
  13. // 页面1:扫码绑定页面
  14. func ScanCodeHandler(c *gin.Context) {
  15. userUUID, err := c.Cookie("uuid")
  16. if err != nil || userUUID == "" {
  17. // 如果 Cookie 中没有 UUID,则生成新 uuid,过期时间 10 分钟
  18. userUUID = uuid.New().String()
  19. c.SetCookie("uuid", userUUID, 3000, "/", "", false, true)
  20. if err = InsertCookie(userUUID); err != nil {
  21. log.Println("cookie写入数据库错误:", err)
  22. }
  23. } else {
  24. var (
  25. id int
  26. resumeId string
  27. bindStatus int
  28. )
  29. //查询简历绑定状态,如果是1 跳转至简历详情页面,2 解绑状态,删除uuid,重新生成重新绑定
  30. row := Db.QueryRow("select id,resume_id,status from bindings where uuid = ? ", userUUID)
  31. if err = row.Scan(&id, &resumeId, &bindStatus); err != nil {
  32. log.Println("获取数据错误:", err)
  33. }
  34. if bindStatus == 2 { //解绑
  35. userUUID = uuid.New().String()
  36. c.SetCookie("uuid", userUUID, 3000, "/", "", false, true)
  37. if err = InsertCookie(userUUID); err != nil {
  38. log.Println("cookie写入数据库错误:", err)
  39. }
  40. }
  41. }
  42. // 渲染模板,模板文件位于 templates/page1.html,此处传递 UUID 参数
  43. c.HTML(http.StatusOK, "page1.html", gin.H{
  44. "UUID": userUUID,
  45. })
  46. }
  47. // SSE 接口,用于推送绑定状态
  48. func EventsHandler(c *gin.Context) {
  49. userUUID := c.Query("uuid")
  50. log.Println("event get uuid", userUUID)
  51. if userUUID == "" {
  52. c.String(http.StatusBadRequest, "缺少 uuid 参数")
  53. return
  54. }
  55. // 设置 SSE 响应头
  56. c.Writer.Header().Set("Content-Type", "text/event-stream")
  57. c.Writer.Header().Set("Cache-Control", "no-cache")
  58. c.Writer.Header().Set("Connection", "keep-alive")
  59. c.Writer.Flush()
  60. ticker := time.NewTicker(1 * time.Second)
  61. timeout := time.After(30 * time.Minute)
  62. defer ticker.Stop()
  63. for {
  64. select {
  65. case <-ticker.C:
  66. _, resumeID, status, err := service.GetBindingByUUID(userUUID)
  67. if err != nil {
  68. continue
  69. }
  70. if status == 1 {
  71. data := fmt.Sprintf("{\"resume_id\":\"%s\"}", resumeID)
  72. fmt.Fprintf(c.Writer, "event: bind\ndata: %s\n\n", data)
  73. c.Writer.Flush()
  74. return
  75. }
  76. case <-timeout:
  77. return
  78. case <-c.Request.Context().Done():
  79. return
  80. }
  81. }
  82. }
  83. func InsertCookie(userUUID string) error {
  84. // 插入待绑定记录到数据库
  85. _, err := Db.Exec("INSERT INTO bindings(uuid, created_at) VALUES(?, ?)", userUUID, time.Now())
  86. if err != nil {
  87. return err
  88. }
  89. return nil
  90. }