一.商品分类的增、删、改、查,以及商品分类的自关联
1.界面展示以及操作说明
列表
商品分类列表展示说明:
(1).增加商品分类按钮
(2).商品分类,以及子分类相关数据列表展示
(3).排序,状态,修改,删除操作处理
新增
编辑
删除
修改状态,排序
2.创建商品分类模型
在controllers/admin下创建GoodsCate.go商品分类控制器
package models
//商品分类
type GoodsCate struct {
Id int
Title string // 标题
CateImg string // 分类图片
Link string // 跳转地址
Template string // 加载的模板: 为空的话加载默认模板, 不为空的话加载自定义模板
Pid int // 上级id: 为0的话则是顶级分类
SubTitle string // SEO标题
Keywords string // SEO关键字
Description string // SEO描述
Sort int // 排序
Status int // 状态: 1 显示, 0 隐藏
AddTime int // 添加时间
GoodsCateItems []GoodsCate `gorm:"foreignKey:pid;references:Id"` // 关联自身,下级分类
}
func (GoodsCate) TableName() string {
return "goods_cate"
}
3.创建商品分类色控制器
在controllers/admin下创建GoodsCateController.go商品分类控制器
上传图片操作代码见: [golang gin框架] 15.Gin 商城项目-封装上传图片方法,轮播图的增删改查以及异步修改状态,数量
package admin
//商品分类
import (
"github.com/gin-gonic/gin"
"goshop/models"
"net/http"
"strings"
)
type GoodsCateController struct {
BaseController
}
func (con GoodsCateController) Index(c *gin.Context) {
//定义一个切片
goodsCateList := []models.GoodsCate{}
//获取分类列表以及下级分类
models.DB.Where("pid = ?", 0).Preload("GoodsCateItems").Find(&goodsCateList)
c.HTML(http.StatusOK, "admin/goodsCate/index.html", gin.H{
"goodsCateList": goodsCateList,
})
}
//新增
func (con GoodsCateController) Add(c *gin.Context) {
//获取商品分类顶级分类
goodsCateList := []models.GoodsCate{}
models.DB.Where("pid = ?", 0).Find(&goodsCateList)
c.HTML(http.StatusOK, "admin/goodsCate/add.html", gin.H{
"goodsCateList": goodsCateList,
})
}
//新增:提交
func (con GoodsCateController) DoAdd(c *gin.Context) {
//获取请求的表单数据
title := strings.Trim(c.PostForm("title"), " ")
link := strings.Trim(c.PostForm("link"), " ")
template := strings.Trim(c.PostForm("template"), " ")
pid, err1 := models.Int(c.PostForm("pid"))
subTitle := strings.Trim(c.PostForm("subTitle"), " ")
keywords := strings.Trim(c.PostForm("keywords"), " ")
description := strings.Trim(c.PostForm("description"), " ")
sort, err2 := models.Int(c.PostForm("sort"))
status, err3 := models.Int(c.PostForm("status"))
if err1 != nil || err3 != nil {
con.Error(c, "非法请求", "/admin/goodsCate/add")
return
}
if err2 != nil {
con.Error(c, "请输入正确的排序值", "/admin/goodsCate/add")
return
}
//文件上传操作
imgSrc, err := models.UploadImg(c, "cate_img")
if err != nil {
con.Error(c, "图片上传失败", "/admin/goodsCate/add")
return
}
//实例化GoodsCate模型
goodsCate := models.GoodsCate{
Title: title,
Link: link,
Sort: sort,
Status: status,
CateImg: imgSrc,
Template: template,
Pid: pid,
SubTitle: subTitle,
Keywords: keywords,
Description: description,
AddTime: int(models.GetUnix()),
}
err = models.DB.Create(&goodsCate).Error
if err != nil {
con.Error(c, "增加商品失败", "/admin/goodsCate/add")
return
}
con.Success(c, "增加商品成功", "/admin/goodsCate")
}
//编辑
func (con GoodsCateController) Edit(c *gin.Context) {
//获取角色id
id, err := models.Int(c.Query("id"))
if err != nil {
con.Error(c, "传入数据错误", "/admin/goodsCate")
return
}
//获取商品分类顶级分类
goodsCateList := []models.GoodsCate{}
models.DB.Where("pid = ?", 0).Find(&goodsCateList)
//获取商品
goodsCate := models.GoodsCate{Id: id}
models.DB.Find(&goodsCate)
c.HTML(http.StatusOK, "admin/goodsCate/edit.html", gin.H{
"goodsCate": goodsCate,
"goodsCateList": goodsCateList,
})
}
//编辑:提交
func (con GoodsCateController) DoEdit(c *gin.Context) {
//获取提交的表单数据
id, err := models.Int(c.PostForm("id"))
if err != nil {
con.Error(c, "传入数据错误", "/admin/goodsCate")
return
}
//获取请求的表单数据
title := strings.Trim(c.PostForm("title"), " ")
link := strings.Trim(c.PostForm("link"), " ")
template := strings.Trim(c.PostForm("template"), " ")
pid, err1 := models.Int(c.PostForm("pid"))
subTitle := strings.Trim(c.PostForm("subTitle"), " ")
keywords := strings.Trim(c.PostForm("keywords"), " ")
description := strings.Trim(c.PostForm("description"), " ")
sort, err2 := models.Int(c.PostForm("sort"))
status, err3 := models.Int(c.PostForm("status"))
if err1 != nil || err3 != nil {
con.Error(c, "非法请求", "/admin/goodsCate/add")
return
}
if err2 != nil {
con.Error(c, "请输入正确的排序值", "/admin/goodsCate/add")
return
}
//文件上传操作
imgSrc, err := models.UploadImg(c, "cate_img")
if err != nil {
con.Error(c, "图片上传失败", "/admin/goodsCate/add")
return
}
//查询分类是否存在
goodsCate := models.GoodsCate{Id: id}
models.DB.Find(&goodsCate)
if imgSrc != "" {
goodsCate.CateImg = imgSrc
}
goodsCate.Title = title
goodsCate.Link = link
goodsCate.Sort = sort
goodsCate.Status = status
goodsCate.Template = template
goodsCate.Pid = pid
goodsCate.SubTitle = subTitle
goodsCate.Keywords = keywords
goodsCate.Description = description
err = models.DB.Save(&goodsCate).Error
if err != nil {
con.Error(c, "修改数据失败", "/admin/goodsCate/edit?id="+models.String(id))
return
}
con.Success(c, "修改数据成功", "/admin/goodsCate")
}
//删除
func (con GoodsCateController) Delete(c *gin.Context) {
//获取提交的表单数据
id, err := models.Int(c.Query("id"))
if err != nil {
con.Error(c, "传入数据错误", "/admin/goodsCate")
return
}
//查询数据是否存在
goodsCate := models.GoodsCate{Id: id}
if goodsCate.Pid == 0 { // 顶级分类
goodsCateList := []models.GoodsCate{}
models.DB.Where("pid = ? ", goodsCate.Id).Find(&goodsCateList)
if len(goodsCateList) > 0 {
con.Error(c, "当前分类下存在子分类,请先删除子分类后再来删除这个数据", "/admin/goodsCate")
return
}
}
err = models.DB.Delete(&goodsCate).Error
if err != nil {
con.Error(c, "删除数据失败", "/admin/goodsCate")
return
}
con.Success(c, "删除数据成功", "/admin/goodsCate")
}
4.创建商品分类html以及js
在templates/admin/goodsCate下创建商品分类相关html
修改状态以及排序操作代码见: [golang gin框架] 15.Gin 商城项目-封装上传图片方法,轮播图的增删改查以及异步修改状态,数量
index.html
{{ define "admin/goodsCate/index.html" }}
{{ template "admin/public/page_header.html" .}}
分类名称 |
分类图片 |
排序 |
状态 |
操作 |
{{range $key,$value := .goodsCateList}}
{{$value.Title}} |
|
{{$value.Sort}} |
{{if eq $value.Status 1}}
{{else}}
{{end}}
|
修改
删除
|
{{range $k,$v := $value.GoodsCateItems}}
----{{$v.Title}} |
|
{{$v.Sort}}
|
{{if eq $v.Status 1}}
{{else}}
{{end}}
|
修改
删除
|
{{end}}
{{end}}