admin.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. . "bindresume/config"
  6. "net/http"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/gin-gonic/gin"
  11. _ "github.com/go-sql-driver/mysql"
  12. )
  13. // 后台简历搜索页,前端页面拆分到 templates/admin_search.html
  14. func adminSearchPageHandler(c *gin.Context) {
  15. c.HTML(http.StatusOK, "admin_search.html", nil)
  16. }
  17. // 后台绑定操作:为待绑定人员绑定简历
  18. func adminBindHandler(c *gin.Context) {
  19. resumeID := strings.TrimSpace(c.PostForm("resume_id"))
  20. if resumeID == "" {
  21. resumeID = c.Query("resume_id")
  22. }
  23. if resumeID == "" {
  24. c.JSON(http.StatusBadRequest, gin.H{"error": "简历ID不能为空"})
  25. return
  26. }
  27. // 查找最早的一条待绑定记录
  28. row := Db.QueryRow("SELECT id, uuid FROM bindings WHERE status = 0 ORDER BY created_at ASC LIMIT 1")
  29. var id int
  30. var waitingUUID string
  31. err := row.Scan(&id, &waitingUUID)
  32. if err != nil {
  33. c.JSON(http.StatusOK, gin.H{"message": "没有待绑定的人员"})
  34. return
  35. }
  36. now := time.Now()
  37. _, err = Db.Exec("UPDATE bindings SET resume_id = ?, status = ?, bound_at = ?, operator = ? WHERE id = ?",
  38. resumeID, 1, now, "admin", id)
  39. if err != nil {
  40. c.JSON(http.StatusInternalServerError, gin.H{"error": "绑定失败"})
  41. return
  42. }
  43. c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("成功绑定 uuid: %s 与简历ID: %s", waitingUUID, resumeID)})
  44. }
  45. // 后台绑定列表页:显示所有绑定记录
  46. // 后台绑定列表页:显示所有绑定记录(分页查询)
  47. func adminListHandler(c *gin.Context) {
  48. // 获取页码参数
  49. pageStr := c.DefaultQuery("page", "1")
  50. page, err := strconv.Atoi(pageStr)
  51. if err != nil || page < 1 {
  52. page = 1
  53. }
  54. pageSize := 10
  55. offset := (page - 1) * pageSize
  56. // 查询总记录数
  57. var totalCount int
  58. row := Db.QueryRow("SELECT COUNT(*) FROM bindings")
  59. if err := row.Scan(&totalCount); err != nil {
  60. c.String(http.StatusInternalServerError, "查询记录总数失败")
  61. return
  62. }
  63. // 查询当前页的记录
  64. 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)
  65. if err != nil {
  66. c.String(http.StatusInternalServerError, "查询失败")
  67. return
  68. }
  69. defer rows.Close()
  70. var bindings []map[string]interface{}
  71. for rows.Next() {
  72. var id, status int
  73. var uuidVal, resumeID, operator string
  74. var createdAt, boundAt sql.NullTime
  75. if err := rows.Scan(&id, &uuidVal, &resumeID, &status, &createdAt, &boundAt, &operator); err != nil {
  76. continue
  77. }
  78. b := map[string]interface{}{
  79. "ID": id,
  80. "UUID": uuidVal,
  81. "ResumeID": resumeID,
  82. "Status": status,
  83. "Operator": operator,
  84. }
  85. if createdAt.Valid {
  86. b["CreatedAt"] = createdAt.Time.Format("2006-01-02 15:04:05")
  87. } else {
  88. b["CreatedAt"] = ""
  89. }
  90. if boundAt.Valid {
  91. b["BoundAt"] = boundAt.Time.Format("2006-01-02 15:04:05")
  92. } else {
  93. b["BoundAt"] = ""
  94. }
  95. bindings = append(bindings, b)
  96. }
  97. // 计算总页数
  98. totalPage := (totalCount + pageSize - 1) / pageSize
  99. // 渲染模板,传递分页信息
  100. c.HTML(http.StatusOK, "admin_list.html", gin.H{
  101. "Bindings": bindings,
  102. "CurrPage": page,
  103. "TotalPage": totalPage,
  104. })
  105. }
  106. // 后台解绑操作,删除绑定记录
  107. func adminUnbindHandler(c *gin.Context) {
  108. idStr := c.PostForm("id")
  109. resume_id := c.PostForm("resume_id")
  110. id, err := strconv.Atoi(idStr)
  111. if err != nil {
  112. c.JSON(http.StatusBadRequest, gin.H{"error": "ID错误"})
  113. return
  114. }
  115. _, err = Db.Exec("UPDATE bindings SET status = 2 WHERE id = ? and resume_id = ? ", id, resume_id)
  116. if err != nil {
  117. c.JSON(http.StatusInternalServerError, gin.H{"error": "解绑失败"})
  118. return
  119. }
  120. c.JSON(http.StatusOK, gin.H{"message": "解绑成功"})
  121. }