编辑
2024-09-21
后端
00
请注意,本文编写于 230 天前,最后修改于 230 天前,其中某些信息可能已经过时。
go
package main import ( "app/internal/config" "database/sql" "fmt" "log" "net/http" "path/filepath" "time" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" ) // ReservoirBasicInfo 结构体映射数据库表 type ReservoirBasicInfo struct { ID int `json:"id"` Name string `json:"name"` Overview string `json:"overview"` Grade string `json:"grade"` TotalStorage float64 `json:"total_storage"` UtilizableStorage float64 `json:"utilizable_storage"` CheckFloodLevel float64 `json:"check_flood_level"` DesignFloodLevel float64 `json:"design_flood_level"` FloodLimitedLevel float64 `json:"flood_limited_level"` ConstructionTime time.Time `json:"construction_time"` AcceptanceTime time.Time `json:"acceptance_time"` Certificate string `json:"certificate"` Image string `json:"image"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` DeletedAt sql.NullTime `json:"deleted_at"` } var db *sql.DB func main() { // 加载配置 cfg, err := config.LoadConfig() if err != nil { log.Fatalf("Failed to load config: %v", err) } fmt.Println(cfg.DatabaseURL) // // 初始化数据库连接 // var err error // db, err = sql.Open("mysql", "root:123nit@tcp(111.229.7.180:3306)/reservoir_data?parseTime=true") // if err != nil { // log.Fatalf("Failed to connect to database: %v", err) // } // defer db.Close() // // 创建 uploads 文件夹 // if err := os.MkdirAll("uploads", os.ModePerm); err != nil { // log.Fatalf("Failed to create uploads directory: %v", err) // } // // 创建 Gin 路由引擎 // router := gin.Default() // // 配置 CORS // router.Use(cors.New(cors.Config{ // AllowOrigins: []string{"*"}, // AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, // AllowHeaders: []string{"Origin", "Content-Type", "Accept", "Authorization"}, // ExposeHeaders: []string{"Content-Length"}, // AllowCredentials: true, // MaxAge: 12 * time.Hour, // })) // // 静态文件服务 // router.Static("/uploads", "./uploads") // // 定义路由 // router.POST("/reservoir/add", createReservoir) // router.GET("/reservoir/get/:id", getReservoir) // router.PUT("/reservoir/up/:id", updateReservoir) // router.DELETE("/reservoir/del/:id", deleteReservoir) // router.POST("/reservoir/:id/certificate", uploadCertificate) // router.POST("/reservoir/:id/image", uploadImage) // router.GET("/reservoir/getAll", getAllReservoirs) // 新增获取所有水库信息的路由 // // 启动 HTTP 服务器 // router.Run(":8080") } // 创建水库信息 func createReservoir(c *gin.Context) { var reservoir ReservoirBasicInfo if err := c.ShouldBindJSON(&reservoir); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } query := ` INSERT INTO reservoir_basic_info (name, overview, grade, total_storage, utilizable_storage, check_flood_level, design_flood_level, flood_limited_level, construction_time, acceptance_time, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW()) ` result, err := db.Exec(query, reservoir.Name, reservoir.Overview, reservoir.Grade, reservoir.TotalStorage, reservoir.UtilizableStorage, reservoir.CheckFloodLevel, reservoir.DesignFloodLevel, reservoir.FloodLimitedLevel, reservoir.ConstructionTime, reservoir.AcceptanceTime) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } id, _ := result.LastInsertId() reservoir.ID = int(id) c.JSON(http.StatusCreated, reservoir) } // 获取水库信息 func getReservoir(c *gin.Context) { id := c.Param("id") var reservoir ReservoirBasicInfo query := ` SELECT id, name, overview, grade, total_storage, utilizable_storage, check_flood_level, design_flood_level, flood_limited_level, construction_time, acceptance_time, certificate, image, created_at, updated_at, deleted_at FROM reservoir_basic_info WHERE id = ? ` err := db.QueryRow(query, id).Scan(&reservoir.ID, &reservoir.Name, &reservoir.Overview, &reservoir.Grade, &reservoir.TotalStorage, &reservoir.UtilizableStorage, &reservoir.CheckFloodLevel, &reservoir.DesignFloodLevel, &reservoir.FloodLimitedLevel, &reservoir.ConstructionTime, &reservoir.AcceptanceTime, &reservoir.Certificate, &reservoir.Image, &reservoir.CreatedAt, &reservoir.UpdatedAt, &reservoir.DeletedAt) if err != nil { if err == sql.ErrNoRows { c.JSON(http.StatusNotFound, gin.H{"error": "Reservoir not found"}) } else { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) } return } c.JSON(http.StatusOK, reservoir) } // 更新水库信息 func updateReservoir(c *gin.Context) { id := c.Param("id") var reservoir ReservoirBasicInfo if err := c.ShouldBindJSON(&reservoir); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } query := ` UPDATE reservoir_basic_info SET name = ?, overview = ?, grade = ?, total_storage = ?, utilizable_storage = ?, check_flood_level = ?, design_flood_level = ?, flood_limited_level = ?, construction_time = ?, acceptance_time = ?, updated_at = NOW() WHERE id = ? ` _, err := db.Exec(query, reservoir.Name, reservoir.Overview, reservoir.Grade, reservoir.TotalStorage, reservoir.UtilizableStorage, reservoir.CheckFloodLevel, reservoir.DesignFloodLevel, reservoir.FloodLimitedLevel, reservoir.ConstructionTime, reservoir.AcceptanceTime, id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "Reservoir updated successfully"}) } // 删除水库信息 func deleteReservoir(c *gin.Context) { id := c.Param("id") query := ` DELETE FROM reservoir_basic_info WHERE id = ? ` _, err := db.Exec(query, id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "Reservoir deleted successfully"}) } // 上传证书 func uploadCertificate(c *gin.Context) { id := c.Param("id") file, err := c.FormFile("file") if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } filename := fmt.Sprintf("certificate_%s_%s", id, filepath.Base(file.Filename)) filepath := filepath.Join("uploads", filename) if err := c.SaveUploadedFile(file, filepath); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } query := ` UPDATE reservoir_basic_info SET certificate = ? WHERE id = ? ` _, err = db.Exec(query, filename, id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "Certificate uploaded successfully", "filename": filename}) } // 上传图片 func uploadImage(c *gin.Context) { id := c.Param("id") file, err := c.FormFile("file") if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } filename := fmt.Sprintf("image_%s_%s", id, filepath.Base(file.Filename)) filepath := filepath.Join("uploads", filename) if err := c.SaveUploadedFile(file, filepath); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } query := ` UPDATE reservoir_basic_info SET image = ? WHERE id = ? ` _, err = db.Exec(query, filename, id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "Image uploaded successfully", "filename": filename}) } // 获取所有水库信息 func getAllReservoirs(c *gin.Context) { var reservoirs []ReservoirBasicInfo query := ` SELECT id, name, overview, grade, total_storage, utilizable_storage, check_flood_level, design_flood_level, flood_limited_level, construction_time, acceptance_time, certificate, image, created_at, updated_at, deleted_at FROM reservoir_basic_info ` rows, err := db.Query(query) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } defer rows.Close() for rows.Next() { var reservoir ReservoirBasicInfo err := rows.Scan(&reservoir.ID, &reservoir.Name, &reservoir.Overview, &reservoir.Grade, &reservoir.TotalStorage, &reservoir.UtilizableStorage, &reservoir.CheckFloodLevel, &reservoir.DesignFloodLevel, &reservoir.FloodLimitedLevel, &reservoir.ConstructionTime, &reservoir.AcceptanceTime, &reservoir.Certificate, &reservoir.Image, &reservoir.CreatedAt, &reservoir.UpdatedAt, &reservoir.DeletedAt) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } reservoirs = append(reservoirs, reservoir) } c.JSON(http.StatusOK, reservoirs) }

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!