renjiaojiao 4 miesięcy temu
rodzic
commit
8f5e46aa5b
5 zmienionych plików z 58 dodań i 174 usunięć
  1. 0 135
      admin.go
  2. 5 26
      controller/front.go
  3. 39 0
      controller/uploadFile.go
  4. 4 13
      main.go
  5. 10 0
      service/bindResume.go

+ 0 - 135
admin.go

@@ -1,135 +0,0 @@
-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": "解绑成功"})
-}

+ 5 - 26
front.go → controller/front.go

@@ -1,7 +1,8 @@
-package main
+package controller
 
 import (
 	. "bindresume/config"
+	"bindresume/service"
 	"fmt"
 	"github.com/google/uuid"
 	"log"
@@ -49,7 +50,7 @@ func ScanCodeHandler(c *gin.Context) {
 }
 
 // SSE 接口,用于推送绑定状态
-func eventsHandler(c *gin.Context) {
+func EventsHandler(c *gin.Context) {
 	userUUID := c.Query("uuid")
 	log.Println("event get uuid", userUUID)
 	if userUUID == "" {
@@ -63,14 +64,14 @@ func eventsHandler(c *gin.Context) {
 	c.Writer.Header().Set("Connection", "keep-alive")
 	c.Writer.Flush()
 
-	ticker := time.NewTicker(2 * time.Second)
+	ticker := time.NewTicker(1 * time.Second)
 	timeout := time.After(30 * time.Minute)
 	defer ticker.Stop()
 
 	for {
 		select {
 		case <-ticker.C:
-			_, resumeID, status, err := getBindingByUUID(userUUID)
+			_, resumeID, status, err := service.GetBindingByUUID(userUUID)
 			if err != nil {
 				continue
 			}
@@ -88,28 +89,6 @@ func eventsHandler(c *gin.Context) {
 	}
 }
 
-// 页面2:简历详情页面
-func page2Handler(c *gin.Context) {
-	userUUID := c.Query("uuid")
-	resumeID := c.Query("resume_id")
-	if userUUID == "" || resumeID == "" {
-		c.String(http.StatusBadRequest, "缺少必要参数")
-		return
-	}
-
-	_, dbResumeID, status, err := getBindingByUUID(userUUID)
-	if err != nil || status != 1 || dbResumeID != resumeID {
-		c.String(http.StatusForbidden, "绑定状态不正确")
-		return
-	}
-	// 刷新 Cookie,设置有效期为 1 天
-	c.SetCookie("uuid", userUUID, 86400, "/", "", false, true)
-	c.HTML(http.StatusOK, "page2.html", gin.H{
-		"UUID":     userUUID,
-		"ResumeID": resumeID,
-	})
-}
-
 func InsertCookie(userUUID string) error {
 	// 插入待绑定记录到数据库
 	_, err := Db.Exec("INSERT INTO bindings(uuid, created_at) VALUES(?, ?)", userUUID, time.Now())

+ 39 - 0
controller/uploadFile.go

@@ -0,0 +1,39 @@
+package controller
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"log"
+	"net/http"
+	"path/filepath"
+)
+
+func UploadFile(r *gin.Context) {
+	// 设置内存限制(默认是 32 MiB)
+	err := r.Request.ParseMultipartForm(32 << 20) // 32 MB
+	if err != nil {
+		r.JSON(http.StatusBadRequest, gin.H{"error": "文件大小超过限制"})
+		return
+	}
+
+	// 获取表单中的文件字段(假设字段名为 "files")
+	form, _ := r.MultipartForm()
+	files := form.File["files"] // "files" 是表单字段名
+
+	// 遍历所有文件
+	savedFiles := make([]string, 0)
+	for _, fileHeader := range files {
+		// 生成保存路径(示例:uploads/ 目录下)
+		filename := filepath.Join("uploads", fileHeader.Filename)
+		if err := r.SaveUploadedFile(fileHeader, filename); err != nil {
+			log.Printf("保存文件失败: %v", err)
+			continue // 跳过当前文件
+		}
+		savedFiles = append(savedFiles, filename)
+	}
+
+	r.JSON(http.StatusOK, gin.H{
+		"message": fmt.Sprintf("%d 个文件上传成功", len(savedFiles)),
+		"files":   savedFiles,
+	})
+}

+ 4 - 13
main.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"bindresume/controller"
 	"html/template"
 	"log"
 
@@ -9,13 +10,6 @@ import (
 	_ "github.com/go-sql-driver/mysql"
 )
 
-// 根据 uuid 查询绑定记录
-func getBindingByUUID(uuidStr string) (id int, resumeID string, status int, err error) {
-	row := Db.QueryRow("SELECT id, resume_id, status FROM bindings WHERE uuid = ?", uuidStr)
-	err = row.Scan(&id, &resumeID, &status)
-	return
-}
-
 func main() {
 	LoadConfig()
 	InitDB()
@@ -35,15 +29,12 @@ func main() {
 	router.Static("/static", "./static")
 
 	// 前台页面路由
-	router.GET("/resume/scanCode", ScanCodeHandler)
-	//router.GET("/resume/page2", page2Handler)
-	router.GET("/resume/events", eventsHandler)
+	router.GET("/resume/scanCode", controller.ScanCodeHandler)
+	router.GET("/resume/events", controller.EventsHandler)
+	router.GET("/resume/uploadFile", controller.UploadFile)
 
 	// 后台管理页面的路由
 	//router.GET("/admin/search", adminSearchPageHandler)
-	//router.POST("/admin/bind", adminBindHandler)
-	//router.GET("/admin/list", adminListHandler)
-	//router.POST("/admin/unbind", adminUnbindHandler)
 
 	log.Println("服务器启动在11 ", SysConfig.Port)
 	router.Run(SysConfig.Port)

+ 10 - 0
service/bindResume.go

@@ -0,0 +1,10 @@
+package service
+
+import "bindresume/config"
+
+// 根据 uuid 查询绑定记录
+func GetBindingByUUID(uuidStr string) (id int, resumeID string, status int, err error) {
+	row := config.Db.QueryRow("SELECT id, resume_id, status FROM bindings WHERE uuid = ?", uuidStr)
+	err = row.Scan(&id, &resumeID, &status)
+	return
+}