go18/book/v2/main.go

112 lines
2.4 KiB
Go
Raw Normal View History

2025-05-11 11:45:08 +08:00
package main
import (
"fmt"
"net/http"
"os"
"122.51.31.227/go-course/go18/book/v2/config"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// Book 结构体定义
type Book struct {
ID uint `json:"id" gorm:"primaryKey"`
Title string `json:"title"`
Author string `json:"author"`
Price float64 `json:"price"`
}
// 初始化数据库
func setupDatabase() *gorm.DB {
mc := config.C().MySQL
// dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
mc.Username,
mc.Password,
mc.Host,
mc.Port,
mc.DB,
)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
db.AutoMigrate(&Book{}) // 自动迁移
return db
}
func main() {
// 加载配置
path := os.Getenv("CONFIG_PATH")
if path == "" {
path = "application.yaml"
}
config.LoadConfigFromYaml(path)
r := gin.Default()
db := setupDatabase()
// 创建书籍
r.POST("/books", func(c *gin.Context) {
var book Book
if err := c.ShouldBindJSON(&book); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
db.Create(&book)
c.JSON(http.StatusCreated, book)
})
// 获取所有书籍
r.GET("/books", func(c *gin.Context) {
var books []Book
db.Find(&books)
c.JSON(http.StatusOK, books)
})
// 根据 ID 获取书籍
r.GET("/books/:id", func(c *gin.Context) {
var book Book
id := c.Param("id")
if err := db.First(&book, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Book not found"})
return
}
c.JSON(http.StatusOK, book)
})
// 更新书籍
r.PUT("/books/:id", func(c *gin.Context) {
var book Book
id := c.Param("id")
if err := db.First(&book, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Book not found"})
return
}
if err := c.ShouldBindJSON(&book); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
db.Save(&book)
c.JSON(http.StatusOK, book)
})
// 删除书籍
r.DELETE("/books/:id", func(c *gin.Context) {
id := c.Param("id")
if err := db.Delete(&Book{}, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Book not found"})
return
}
c.JSON(http.StatusNoContent, nil)
})
ac := config.C().Application
r.Run(fmt.Sprintf("%s:%d", ac.Host, ac.Port)) // 启动服务
}