基于golang的gin编程框架和gorm基础库,实现一个商品的无限级分类管理功能
表中设置三个字段,id为自增主键,type_id是商品标识号,parent_id是商品的上一级标识号,name是商品名称,通过type_id和parent_id实现树状结构,达到商品的无限级分类功能
需要提供的参数是新增商品的type_id,name,parent_id
注意:新增商品的parent_id和直接父类的type_id保持一致
需要提供的参数是父类的type_id,程序返回其所有直接子级商品
type ProductInfo struct {
ID int `json:"id"`
TypeId string `json:"type_id"`
Name string `json:"name"`
ParentId string `json:"parent_id"`
}
func initTable(){
//创建数据行
u1:= ProductInfo{TypeId: "101", Name: "家电", ParentId: "100"}
db.Create(&u1)
u2:=ProductInfo{TypeId: "102", Name: "数码", ParentId: "100"}
db.Create(&u2)
u3:=ProductInfo{TypeId: "103", Name: "食品", ParentId: "100"}
db.Create(&u3)
u4:=ProductInfo{TypeId: "104", Name: "电视", ParentId: "101"}
db.Create(&u4)
u5:=ProductInfo{TypeId: "105", Name: "笔记本", ParentId: "102"}
db.Create(&u5)
u6:=ProductInfo{TypeId: "106", Name: "可乐", ParentId: "103"}
db.Create(&u6)
u7:=ProductInfo{TypeId: "107", Name: "全面屏电视", ParentId: "104"}
db.Create(&u7)
u8:=ProductInfo{TypeId: "108", Name: "商务笔记本", ParentId: "105"}
db.Create(&u8)
u9:=ProductInfo{TypeId: "109", Name: "牛肉干", ParentId: "103"}
db.Create(&u9)
u10:=ProductInfo{TypeId: "110", Name: "手机", ParentId: "102"}
db.Create(&u10)
return
}
ID | Type_Id | Name | Parent_Id |
---|---|---|---|
1 | 101 | 家电 | 100 |
2 | 102 | 数码 | 100 |
3 | 103 | 食品 | 100 |
4 | 104 | 电视 | 101 |
5 | 105 | 笔记本 | 102 |
6 | 106 | 可乐 | 103 |
7 | 107 | 全面屏电视 | 104 |
8 | 108 | 商务笔记本 | 105 |
9 | 109 | 牛肉干 | 103 |
10 | 110 | 手机 | 102 |
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
ID | int(11) | NO | PRI | NULL | auto_increment |
Type_Id | varchar(255) | YES | NULL | ||
Name | varchar(255) | YES | NULL | ||
Parent_Id | varchar(255) | YES | NULL |
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"net/http"
)
type ProductInfo struct {
ID int `json:"id"`
TypeId string `json:"type_id"`
Name string `json:"name"`
ParentId string `json:"parent_id"`
}
var(
db *gorm.DB
err error
)
func Search(c *gin.Context){
typeid := c.Param("typeid")
var product []ProductInfo
// Get all matched records
db.Where(&ProductInfo{ParentId: typeid}).Find(&product)
if err:=db.Find(&ProductInfo{}).Error;err!=nil{
c.AbortWithStatus(404)
fmt.Println(err)
}else{
c.JSON(http.StatusOK, product)
}
}
func Add(c *gin.Context){
//新增商品
var newPro ProductInfo
typeid:=c.PostForm("typeid")
name:=c.PostForm("name")
parentid:=c.PostForm("parentid")
newPro = ProductInfo{TypeId: typeid, Name: name, ParentId: parentid}
db.Create(&newPro)
err := db.Debug().Save(&newPro).Error
if err != nil {
panic(err)
}
c.JSON(http.StatusOK, gin.H{
"typeid": typeid,
"name": name,
"parentid":parentid,
})
}
func initTable(){
//创建数据行
u1:= ProductInfo{TypeId: "101", Name: "家电", ParentId: "100"}
db.Create(&u1)
u2:=ProductInfo{TypeId: "102", Name: "数码", ParentId: "100"}
db.Create(&u2)
u3:=ProductInfo{TypeId: "103", Name: "食品", ParentId: "100"}
db.Create(&u3)
u4:=ProductInfo{TypeId: "104", Name: "电视", ParentId: "101"}
db.Create(&u4)
u5:=ProductInfo{TypeId: "105", Name: "笔记本", ParentId: "102"}
db.Create(&u5)
u6:=ProductInfo{TypeId: "106", Name: "可乐", ParentId: "103"}
db.Create(&u6)
u7:=ProductInfo{TypeId: "107", Name: "全面屏电视", ParentId: "104"}
db.Create(&u7)
u8:=ProductInfo{TypeId: "108", Name: "商务笔记本", ParentId: "105"}
db.Create(&u8)
u9:=ProductInfo{TypeId: "109", Name: "牛肉干", ParentId: "103"}
db.Create(&u9)
u10:=ProductInfo{TypeId: "110", Name: "手机", ParentId: "102"}
db.Create(&u10)
return
}
func main(){
//连接数据库
db, err = gorm.Open("mysql", "root:password@(localhost)/golang?charset=utf8mb4&parseTime=True&loc=Local")
if err!=nil{
panic(err)
}
defer db.Close()
//创建表,自动迁移(把结构体和数据表对应)
db.AutoMigrate(&ProductInfo{})
//创建数据表
//initTable()
router:=gin.Default()
//查找,参数为typeid
router.GET("/search/:typeid",Search)
//添加,参数为typeid,name,parentid
router.POST("/add", Add)
router.Run(":8080")
}
curl --location --request POST 'http://127.0.0.1:8080/add' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'typeid=111' \
--data-urlencode 'name=百事可乐' \
--data-urlencode 'parentid=106'
curl --location --request GET 'http://127.0.0.1:8080/search/100' \
--header 'Content-Type: application/x-www-form-urlencoded'
查找typeid=102的所有直接子类商品
添加商品:typeid=114,name=iphone,parentid=110