基于gin框架实现商品的无限级分类管理

基于gin框架实现商品的无限级分类管理

基于golang的gin编程框架和gorm基础库,实现一个商品的无限级分类管理功能

一、无限级别分类功能数据库设计

1、思路:

表中设置三个字段,id为自增主键,type_id是商品标识号,parent_id是商品的上一级标识号,name是商品名称,通过type_idparent_id实现树状结构,达到商品的无限级分类功能

2、增加商品:

需要提供的参数是新增商品的type_idnameparent_id

注意:新增商品的parent_id和直接父类的type_id保持一致

3、查找直接子类商品:

需要提供的参数是父类的type_id,程序返回其所有直接子级商品

4、建表:

type ProductInfo struct {
	ID      int `json:"id"`
	TypeId   string `json:"type_id"`
	Name     string `json:"name"`
	ParentId string `json:"parent_id"`
}

5、存储过程:

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
}

6、测试数据表:

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

7、数据库信息表:

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命令的测试用例脚本

增加:

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的所有直接子类商品
基于gin框架实现商品的无限级分类管理_第1张图片
添加商品:typeid=114,name=iphone,parentid=110
基于gin框架实现商品的无限级分类管理_第2张图片

你可能感兴趣的:(Golang)