涛子 - 简单就是美

成单纯魁增,永继振国兴,克复宗清政,广开家必升

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  428 随笔 :: 0 文章 :: 19 评论 :: 22万 阅读
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

func Database() *gorm.DB {
	//open a db connection
	db, err := gorm.Open("mysql", "root:pass@tcp(127.0.0.1:8889)/gotest?parseTime=true")
	if err != nil {
		panic("failed to connect database")
	}
	return db
}

func main() {

	//Migrate the schema
	db := Database()
	db.AutoMigrate(&Product{})
	router := gin.Default()
	router.GET("/", startPage)
	router.LoadHTMLGlob("templates/*")
	v1 := router.Group("/api/v1/")
	{
		v1.POST("product/", CreateProduct)
		v1.GET("product/", FetchAllProduct)
		v1.GET("product/:id", FetchSingleProduct)
		v1.PUT("product/:id", UpdateProduct)
		v1.DELETE("product/:id", DeleteProduct)
	}
	router.Run()

}

type Product struct {
	gorm.Model
	Name        string `json:"name"`
	Description string `json:"description"`
	Images      string `json:"images"`
	Price       string `json:"price"`
}

type TransformedProduct struct {
	ID          uint   `json:"id"`
	Name        string `json:"name"`
	Description string `json:"description"`
	Images      string `json:"images"`
	Price       string `json:"price"`
}

func CreateProduct(c *gin.Context) {

	product := Product{
		Name:        c.PostForm("name"),
		Description: c.PostForm("description"),
		Images:      c.PostForm("images"),
		Price:       c.PostForm("price"),
	}
	db := Database()
	db.Save(&product)
	c.JSON(http.StatusCreated, gin.H{"status": http.StatusCreated, "message": "Product item created successfully!", "resourceId": product.ID})
}

func FetchAllProduct(c *gin.Context) {
	var products []Product
	var _products []TransformedProduct

	db := Database()
	db.Find(&products)

	if len(products) <= 0 {
		c.JSON(http.StatusNotFound, gin.H{"status": http.StatusNotFound, "message": "No todo found!"})
		return
	}

	//transforms the todos for building a good response
	for _, item := range products {
		_products = append(
			_products, TransformedProduct{
				ID:          item.ID,
				Name:        item.Name,
				Description: item.Description,
				Images:      item.Images,
				Price:       item.Price,
			})
	}
	c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": _products})
}

func FetchSingleProduct(c *gin.Context) {
	var product Product
	productId := c.Param("id")

	db := Database()
	db.First(&product, productId)

	if product.ID == 0 {
		c.JSON(http.StatusNotFound, gin.H{"status": http.StatusNotFound, "message": "No product found!"})
		return
	}

	_product := TransformedProduct{
		ID:          product.ID,
		Name:        product.Name,
		Description: product.Description,
		Images:      product.Images,
		Price:       product.Price,
	}
	c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": _product})
}

func UpdateProduct(c *gin.Context) {
	var product Product
	tproductId := c.Param("id")
	db := Database()
	db.First(&product, tproductId)

	if product.ID == 0 {
		c.JSON(http.StatusNotFound, gin.H{"status": http.StatusNotFound, "message": "No product found!"})
		return
	}

	db.Model(&product).Update("name", c.PostForm("name"))
	db.Model(&product).Update("descroption", c.PostForm("descroption"))
	db.Model(&product).Update("images", c.PostForm("images"))
	db.Model(&product).Update("price", c.PostForm("price"))
	c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "message": "Product updated successfully!"})
}

func DeleteProduct(c *gin.Context) {
	var product Product
	productId := c.Param("id")
	db := Database()
	db.First(&product, productId)

	if product.ID == 0 {
		c.JSON(http.StatusNotFound, gin.H{"status": http.StatusNotFound, "message": "No product found!"})
		return
	}

	db.Delete(&product)
	c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "message": "product deleted successfully!"})
}

func startPage(c *gin.Context) {
	c.HTML(http.StatusOK, "index.tmpl", gin.H{
		"title": "simple api gin",
	})
}
posted on   北京涛子  阅读(568)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
历史上的今天:
2016-09-19 openldap安装配置
点击右上角即可分享
微信分享提示