package controller import ( . "bindresume/config" "bindresume/service" "fmt" "github.com/google/uuid" "log" "net/http" "time" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" ) // 页面1:扫码绑定页面 func ScanCodeHandler(c *gin.Context) { userUUID, err := c.Cookie("uuid") if err != nil || userUUID == "" { // 如果 Cookie 中没有 UUID,则生成新 uuid,过期时间 10 分钟 userUUID = uuid.New().String() c.SetCookie("uuid", userUUID, 3000, "/", "", false, true) if err = InsertCookie(userUUID); err != nil { log.Println("cookie写入数据库错误:", err) } } else { var ( id int resumeId string bindStatus int ) //查询简历绑定状态,如果是1 跳转至简历详情页面,2 解绑状态,删除uuid,重新生成重新绑定 row := Db.QueryRow("select id,resume_id,status from bindings where uuid = ? ", userUUID) if err = row.Scan(&id, &resumeId, &bindStatus); err != nil { log.Println("获取数据错误:", err) } if bindStatus == 2 { //解绑 userUUID = uuid.New().String() c.SetCookie("uuid", userUUID, 3000, "/", "", false, true) if err = InsertCookie(userUUID); err != nil { log.Println("cookie写入数据库错误:", err) } } } // 渲染模板,模板文件位于 templates/page1.html,此处传递 UUID 参数 c.HTML(http.StatusOK, "page1.html", gin.H{ "UUID": userUUID, }) } // SSE 接口,用于推送绑定状态 func EventsHandler(c *gin.Context) { userUUID := c.Query("uuid") log.Println("event get uuid", userUUID) if userUUID == "" { c.String(http.StatusBadRequest, "缺少 uuid 参数") return } // 设置 SSE 响应头 c.Writer.Header().Set("Content-Type", "text/event-stream") c.Writer.Header().Set("Cache-Control", "no-cache") c.Writer.Header().Set("Connection", "keep-alive") c.Writer.Flush() ticker := time.NewTicker(1 * time.Second) timeout := time.After(30 * time.Minute) defer ticker.Stop() for { select { case <-ticker.C: _, resumeID, status, err := service.GetBindingByUUID(userUUID) if err != nil { continue } if status == 1 { data := fmt.Sprintf("{\"resume_id\":\"%s\"}", resumeID) fmt.Fprintf(c.Writer, "event: bind\ndata: %s\n\n", data) c.Writer.Flush() return } case <-timeout: return case <-c.Request.Context().Done(): return } } } func InsertCookie(userUUID string) error { // 插入待绑定记录到数据库 _, err := Db.Exec("INSERT INTO bindings(uuid, created_at) VALUES(?, ?)", userUUID, time.Now()) if err != nil { return err } return nil }