package main import ( "database/sql" "fmt" . "bindresume/config" "net/http" "strconv" "strings" "time" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" ) // 后台简历搜索页,前端页面拆分到 templates/admin_search.html func adminSearchPageHandler(c *gin.Context) { c.HTML(http.StatusOK, "admin_search.html", nil) } // 后台绑定操作:为待绑定人员绑定简历 func adminBindHandler(c *gin.Context) { resumeID := strings.TrimSpace(c.PostForm("resume_id")) if resumeID == "" { resumeID = c.Query("resume_id") } if resumeID == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "简历ID不能为空"}) return } // 查找最早的一条待绑定记录 row := Db.QueryRow("SELECT id, uuid FROM bindings WHERE status = 0 ORDER BY created_at ASC LIMIT 1") var id int var waitingUUID string err := row.Scan(&id, &waitingUUID) if err != nil { c.JSON(http.StatusOK, gin.H{"message": "没有待绑定的人员"}) return } now := time.Now() _, err = Db.Exec("UPDATE bindings SET resume_id = ?, status = ?, bound_at = ?, operator = ? WHERE id = ?", resumeID, 1, now, "admin", id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "绑定失败"}) return } c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("成功绑定 uuid: %s 与简历ID: %s", waitingUUID, resumeID)}) } // 后台绑定列表页:显示所有绑定记录 // 后台绑定列表页:显示所有绑定记录(分页查询) func adminListHandler(c *gin.Context) { // 获取页码参数 pageStr := c.DefaultQuery("page", "1") page, err := strconv.Atoi(pageStr) if err != nil || page < 1 { page = 1 } pageSize := 10 offset := (page - 1) * pageSize // 查询总记录数 var totalCount int row := Db.QueryRow("SELECT COUNT(*) FROM bindings") if err := row.Scan(&totalCount); err != nil { c.String(http.StatusInternalServerError, "查询记录总数失败") return } // 查询当前页的记录 rows, err := Db.Query("SELECT id, uuid, resume_id, status, created_at, bound_at, operator FROM bindings ORDER BY id DESC LIMIT ? OFFSET ?", pageSize, offset) if err != nil { c.String(http.StatusInternalServerError, "查询失败") return } defer rows.Close() var bindings []map[string]interface{} for rows.Next() { var id, status int var uuidVal, resumeID, operator string var createdAt, boundAt sql.NullTime if err := rows.Scan(&id, &uuidVal, &resumeID, &status, &createdAt, &boundAt, &operator); err != nil { continue } b := map[string]interface{}{ "ID": id, "UUID": uuidVal, "ResumeID": resumeID, "Status": status, "Operator": operator, } if createdAt.Valid { b["CreatedAt"] = createdAt.Time.Format("2006-01-02 15:04:05") } else { b["CreatedAt"] = "" } if boundAt.Valid { b["BoundAt"] = boundAt.Time.Format("2006-01-02 15:04:05") } else { b["BoundAt"] = "" } bindings = append(bindings, b) } // 计算总页数 totalPage := (totalCount + pageSize - 1) / pageSize // 渲染模板,传递分页信息 c.HTML(http.StatusOK, "admin_list.html", gin.H{ "Bindings": bindings, "CurrPage": page, "TotalPage": totalPage, }) } // 后台解绑操作,删除绑定记录 func adminUnbindHandler(c *gin.Context) { idStr := c.PostForm("id") resume_id := c.PostForm("resume_id") id, err := strconv.Atoi(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "ID错误"}) return } _, err = Db.Exec("UPDATE bindings SET status = 2 WHERE id = ? and resume_id = ? ", id, resume_id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "解绑失败"}) return } c.JSON(http.StatusOK, gin.H{"message": "解绑成功"}) }