gopackage 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 许可协议。转载请注明出处!