网站站点建设的端口,中山织树网站建设,58同城网网站建设,莱芜金点子租房信息港一.商品分类的增、删、改、查,以及商品分类的自关联1.界面展示以及操作说明列表商品分类列表展示说明:(1).增加商品分类按钮(2).商品分类,以及子分类相关数据列表展示(3).排序,状态,修改,删除操作处理 新增编辑删除修改状态,排序2.创建商品分类模型在controllers/admin下创建Go…一.商品分类的增、删、改、查,以及商品分类的自关联1.界面展示以及操作说明列表商品分类列表展示说明: (1).增加商品分类按钮 (2).商品分类,以及子分类相关数据列表展示 (3).排序,状态,修改,删除操作处理 新增编辑删除修改状态,排序2.创建商品分类模型在controllers/admin下创建GoodsCate.go商品分类控制器package models//商品分类type GoodsCate struct {Id intTitle 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/gingoshop/modelsnet/httpstrings
)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).Errorif err ! nil {con.Error(c, 增加商品失败, /admin/goodsCate/add)return}con.Success(c, 增加商品成功, /admin/goodsCate)
}//编辑
func (con GoodsCateController) Edit(c *gin.Context) {//获取角色idid, 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 titlegoodsCate.Link linkgoodsCate.Sort sortgoodsCate.Status statusgoodsCate.Template templategoodsCate.Pid pidgoodsCate.SubTitle subTitlegoodsCate.Keywords keywordsgoodsCate.Description descriptionerr models.DB.Save(goodsCate).Errorif err ! nil {con.Error(c, 修改数据失败, /admin/goodsCate/edit?idmodels.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).Errorif 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 .}}div classcontainer-fluiddiv classrowdiv classpanel panel-defaultdiv classpanel-headinga href/admin/goodsCate/add classbtn btn-primary增加商品分类/a/div!--列表展示--div classtable-responsivetable classtable table-borderedtheadtr classthth分类名称/thth分类图片/thth classtext-center排序/thth classtext-center状态/thth classtext-center操作/th/tr/theadtbody{{range $key,$value : .goodsCateList}} trtd{{$value.Title}}/tdtd/tdtdspan classchSpanNum data-id{{$value.Id}} data-tablegoods_cate data-fieldsort{{$value.Sort}}/span/tdtd classtext-center{{if eq $value.Status 1}} img src/static/admin/images/yes.gif classchStatus data-id{{$value.Id}} data-tablegoods_cate data-fieldstatus /{{else}}img src/static/admin/images/no.gif classchStatus data-id{{$value.Id}} data-tablegoods_cate data-fieldstatus /{{end}}/td td classtext-center a href/admin/goodsCate/edit?id{{$value.Id}} /修改/a a classdelete href/admin/goodsCate/delete?id{{$value.Id}} /删除/a/td/tr{{range $k,$v : $value.GoodsCateItems}} trtd ----{{$v.Title}}/tdtdimg src/{{$v.CateImg}} width80 //tdtd classtext-centerspan classchSpanNum data-id{{$v.Id}} data-tablegoods_cate data-fieldsort data-num{{$v.Sort}}{{$v.Sort}}/span/tdtd classtext-center{{if eq $v.Status 1}} img src/static/admin/images/yes.gif classchStatus data-id{{$v.Id}} data-tablegoods_cate data-fieldstatus /{{else}}img src/static/admin/images/no.gif classchStatus data-id{{$v.Id}} data-tablegoods_cate data-fieldstatus /{{end}}/tdtd classtext-center a href/admin/goodsCate/edit?id{{$v.Id}} /修改/a a classdelete href/admin/goodsCate/delete?id{{$v.Id}} /删除/a/td/tr{{end}}{{end}}/tbody/table/div/div/div
/div
/body
/html
{{end}}add.html{{ define admin/goodsCate/add.html }}
{{ template admin/public/page_header.html .}}
div classcontainer-fluiddiv classrowdiv classpanel panel-defaultdiv classpanel-heading增加分类/divdiv classpanel-bodydiv classtable-responsive input-formform action/admin/goodsCate/doAdd methodpost enctypemultipart/form-dataulli span分类名称:/span input typetext nametitle classinput //lili span上级分类:/spanselect namepid idpidoption value0顶级分类/option{{range $key,$value : .goodsCateList}}option value{{$value.Id}}{{$value.Title}}/option{{end}}/select/li li span分类图片:/span input typefile namecate_img//li li span跳转地址:/span input typetext namelink classinput//li li span分类模板:/span input typetext nametemplate classinput/span空表示默认模板/span/lili spanSeo标题:/span input typetext namesub_title classinput//lili spanSeo关键词: /spaninput typetext namekeywords classinput//lili spanSeo描述:/span textarea namedescription iddescription cols84 rows4/textarea/li li span排 序:/span input typetext namesort value10//li li span状 态:/span input typeradio namestatus checked value1 ida/ label fora显示/label input typeradio namestatus value0 idb/label forb隐藏/label /lilibr/button typesubmit classbtn btn-primary提交/button/li/ul/form/div/div/div/div
/div
/body
/html
{{end}}edit.html{{ define admin/goodsCate/edit.html }}
{{ template admin/public/page_header.html .}}
div classcontainer-fluiddiv classrowdiv classpanel panel-defaultdiv classpanel-heading修改分类/divdiv classpanel-bodydiv classtable-responsive input-formform action/admin/goodsCate/doEdit methodpost enctypemultipart/form-dataulinput typehidden nameid value{{.goodsCate.Id}}li span分类名称:/span input typetext nametitle classinput value{{.goodsCate.Title}} //lili span上级分类:/span{{$pid : .goodsCate.Pid}}select namepid idpidoption value0顶级分类/option{{range $key,$value : .goodsCateList}} {{if eq $pid $value.Id}} option selected value{{$value.Id}}{{$value.Title}}/option{{else}}option value{{$value.Id}}{{$value.Title}}/option{{end}}{{end}}/select/li li span分类图片:/span input typefile namecate_img//li {{if ne .goodsCate.CateImg }}img src/{{.goodsCate.CateImg}} width100px size60 /{{end}}li span跳转地址:/span input typetext namelink classinput value{{.goodsCate.Link}}//li li span分类模板:/span input typetext nametemplate classinput value{{.goodsCate.Template}}/span空表示默认模板/span/lili spanSeo标题:/span input typetext namesub_title classinput value{{.goodsCate.SubTitle}}//lili spanSeo关键词: /spaninput typetext namekeywords classinput value{{.goodsCate.Keywords}}//lili spanSeo描述:/span textarea namedescription iddescription cols84 rows4{{.goodsCate.Description}}/textarea/li li span排 序:/span input typetext namesort value{{.goodsCate.Sort}}//li li span状 态:/span input typeradio namestatus {{if eq .goodsCate.Status 1}}checked{{end}} value1 ida/ label fora显示/label input typeradio namestatus {{if eq .goodsCate.Status 0}}checked{{end}} value0 idb/label forb隐藏/label /lilibr/button typesubmit classbtn btn-primary提交/button/li/ul/form/div/div/div/div
/div
/body
/html{{end}}5.配置路由在routes/adminRouters.go下增加商品分类路由//商品分类路由
adminRouters.GET(/goodsCate, admin.GoodsCateController{}.Index)
adminRouters.GET(/goodsCate/add, admin.GoodsCateController{}.Add)
adminRouters.POST(/goodsCate/doAdd, admin.GoodsCateController{}.DoAdd)
adminRouters.GET(/goodsCate/edit, admin.GoodsCateController{}.Edit)
adminRouters.POST(/goodsCate/doEdit, admin.GoodsCateController{}.DoEdit)
adminRouters.GET(/goodsCate/delete, admin.GoodsCateController{}.Delete)二.商品类型的增、删、改、查1.界面展示以及操作说明列表商品类型列表展示说明: (1).增加商品类型按钮 (2).商品类型,相关数据列表展示 (3).状态,修改,删除,类型属性操作处理 新增编辑删除修改状态2.创建商品类型模型在controllers/admin下创建GoodsType.go商品类型控制器package models//商品类型type GoodsType struct {Id intTitle string // 类型名称Description string // 介绍Status int // 状态AddTime int // 添加时间
}func (GoodsType) TableName() string {return goods_type
}3.创建商品类型控制器在controllers/admin下创建GoodsTypeController.go商品类型控制器package adminimport (goshop/modelsnet/httpstringsgithub.com/gin-gonic/gin
)type GoodsTypeController struct {BaseController
}func (con GoodsTypeController) Index(c *gin.Context) {goodsTypeList : []models.GoodsType{}models.DB.Find(goodsTypeList)c.HTML(http.StatusOK, admin/goodsType/index.html, gin.H{goodsTypeList: goodsTypeList,})}
func (con GoodsTypeController) Add(c *gin.Context) {c.HTML(http.StatusOK, admin/goodsType/add.html, gin.H{})
}func (con GoodsTypeController) DoAdd(c *gin.Context) {title : strings.Trim(c.PostForm(title), )description : strings.Trim(c.PostForm(description), )status, err1 : models.Int(c.PostForm(status))if err1 ! nil {con.Error(c, 传入的参数不正确, /admin/goodsType/add)return}if title {con.Error(c, 标题不能为空, /admin/goodsType/add)return}goodsType : models.GoodsType{Title: title,Description: description,Status: status,AddTime: int(models.GetUnix()),}err : models.DB.Create(goodsType).Errorif err ! nil {con.Error(c, 增加商品类型失败 请重试, /admin/goodsType/add)} else {con.Success(c, 增加商品类型成功, /admin/goodsType)}}
func (con GoodsTypeController) Edit(c *gin.Context) {id, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入数据错误, /admin/goodsType)} else {goodsType : models.GoodsType{Id: id}models.DB.Find(goodsType)c.HTML(http.StatusOK, admin/goodsType/edit.html, gin.H{goodsType: goodsType,})}}
func (con GoodsTypeController) DoEdit(c *gin.Context) {id, err1 : models.Int(c.PostForm(id))title : strings.Trim(c.PostForm(title), )description : strings.Trim(c.PostForm(description), )status, err2 : models.Int(c.PostForm(status))if err1 ! nil || err2 ! nil {con.Error(c, 传入数据错误, /admin/goodsType)return}if title {con.Error(c, 商品类型的标题不能为空, /admin/goodsType/edit?idmodels.String(id))}goodsType : models.GoodsType{Id: id}models.DB.Find(goodsType)goodsType.Title titlegoodsType.Description descriptiongoodsType.Status statuserr3 : models.DB.Save(goodsType).Errorif err3 ! nil {con.Error(c, 修改数据失败, /admin/goodsType/edit?idmodels.String(id))} else {con.Success(c, 修改数据成功, /admin/goodsType)}
}
func (con GoodsTypeController) Delete(c *gin.Context) {id, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入数据错误, /admin/goodsType)} else {goodsType : models.GoodsType{Id: id}models.DB.Delete(goodsType)con.Success(c, 删除数据成功, /admin/goodsType)}
}4.创建商品类型html以及js在templates/admin/goodsType下创建商品类型相关html修改状态操作代码见:[golang gin框架] 15.Gin 商城项目-封装上传图片方法,轮播图的增删改查以及异步修改状态,数量index.html{{ define admin/goodsType/index.html }}
{{ template admin/public/page_header.html .}}
div classcontainer-fluiddiv classrowdiv classpanel panel-defaultdiv classpanel-headingdiv classpagination idpa/diva href/admin/goodsType/add classbtn btn-primary增加商品类型/a/div!--列表展示--div classtable-responsivetable classtable table-borderedtheadtr classthth商品类型名称/thth商品类型描述/thth classtext-center状态/thth classtext-center操作/th/tr/theadtbody{{range $key,$value : .goodsTypeList}}trtd{{$value.Title}}/tdtd{{$value.Description}}/tdtd classtext-center{{if eq $value.Status 1}} img src/static/admin/images/yes.gif classchStatus data-id{{$value.Id}} data-tablegoods_type data-fieldstatus /{{else}}img src/static/admin/images/no.gif classchStatus data-id{{$value.Id}} data-tablegoods_type data-fieldstatus /{{end}}/tdtd classtext-centera href/admin/goodsTypeAttribute?id{{$value.Id}}类型属性/aa href/admin/goodsType/edit?id{{$value.Id}}修改/a a classdeletehref/admin/goodsType/delete?id{{$value.Id}}删除/a/td/tr{{end}}/tbody/table/div/div/div
/div
/body
/html
{{end}}add.html{{ define admin/goodsType/add.html }}
{{ template admin/public/page_header.html .}}
div classcontainer-fluiddiv classrowdiv classpanel panel-default div classpanel-heading增加商品类型/divdiv classpanel-bodydiv classtable-responsive input-formform action/admin/goodsType/doAdd methodpostulli类型名称: input typetext nametitle//lili类型描述:textarea namedescription cols60 rows8/textarea/lili 状 态: input typeradio namestatus checked value1 ida/ label fora显示/label input typeradio namestatus value0 idb/label forb隐藏/label /lililibr/button typesubmit classbtn btn-default提交/button/li/ul/form/div/div/div/div
/div
/body
/html
{{end}}edit.html{{ define admin/goodsType/edit.html }}
{{ template admin/public/page_header.html .}}
div classcontainer-fluiddiv classrowdiv classpanel panel-default div classpanel-heading修改商品类型/divdiv classpanel-bodydiv classtable-responsive input-formform action/admin/goodsType/doEdit methodpostulinput typehidden nameid value{{.goodsType.Id}} /li类型名称: input typetext nametitle value{{.goodsType.Title}}//lili类型描述:textarea namedescription id cols60 rows8{{.goodsType.Description}}/textarea/lili 状 态: input typeradio namestatus {{if eq .goodsType.Status 1}}checked{{end}} value1 ida/ label fora显示/label input typeradio namestatus {{if eq .goodsType.Status 0}}checked{{end}} value0 idb/label forb隐藏/label /lililibr/button typesubmit classbtn btn-default提交/button/li/ul/form/div/div/div/div
/div
/body
/html
{{end}}5.配置路由在routes/adminRouters.go下配置商品类型路由//商品类型路由
adminRouters.GET(/goodsType, admin.GoodsTypeController{}.Index)
adminRouters.GET(/goodsType/add, admin.GoodsTypeController{}.Add)
adminRouters.POST(/goodsType/doAdd, admin.GoodsTypeController{}.DoAdd)
adminRouters.GET(/goodsType/edit, admin.GoodsTypeController{}.Edit)
adminRouters.POST(/goodsType/doEdit, admin.GoodsTypeController{}.DoEdit)
adminRouters.GET(/goodsType/delete, admin.GoodsTypeController{}.Delete)
三.商品类型属性的增、删、改、查1.界面展示以及操作说明列表点击商品类型列表中,对应商品类型的类型属性,跳转到商品类型属性列表页面,以电脑类型为例,展示说明: (1).增加商品类型属性按钮 (2).商品类型属性,相关数据列表展示 (3).排序,状态,修改,删除,操作处理 新增选择商品类型,以及录入方式 (可以自行增加很多录入方式,具体根据具体业务分析),进行添加编辑删除修改状态2.创建商品类型属性模型在controllers/admin下创建GoodsTypeAttribute.go商品类型属性控制器package models// 商品类型属性设置type GoodsTypeAttribute struct {Id int json:id // HTML页面使用名称CateId int json:cate_id //商品类型id:商品类型表goods_type.idTitle string json:title // 属性名称AttrType int json:attr_type //属性录入方式: 1 单行文本框, 2 多行文本框, 3 从下面列表中选择(一行代表一个可选值)AttrValue string json:attr_value //可选值列表Status int json:status // 状态Sort int json:sort //排序AddTime int json:add_time //增加时间
}func (GoodsTypeAttribute) TableName() string {return goods_type_attribute
}3.创建商品类型属性控制器在controllers/admin下创建GoodsTypeAttributeController.go商品类型属性控制器package adminimport (goshop/modelsnet/httpstringsgithub.com/gin-gonic/gin
)type GoodsTypeAttributeController struct {BaseController
}func (con GoodsTypeAttributeController) Index(c *gin.Context) {cateId, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入的参数不正确, /admin/goodsType)return}//获取商品类型属性goodsTypeAttributeList : []models.GoodsTypeAttribute{}models.DB.Where(cate_id?, cateId).Find(goodsTypeAttributeList)//获取商品类型属性对应的类型goodsType : models.GoodsType{}models.DB.Where(id?, cateId).Find(goodsType)c.HTML(http.StatusOK, admin/goodsTypeAttribute/index.html, gin.H{cateId: cateId,goodsTypeAttributeList: goodsTypeAttributeList,goodsType: goodsType,})}
func (con GoodsTypeAttributeController) Add(c *gin.Context) {//获取当前商品类型属性对应的类型idcateId, err : models.Int(c.Query(cate_id))if err ! nil {con.Error(c, 传入的参数不正确, /admin/goodsType)return}//获取所有的商品类型goodsTypeList : []models.GoodsType{}models.DB.Find(goodsTypeList)c.HTML(http.StatusOK, admin/goodsTypeAttribute/add.html, gin.H{goodsTypeList: goodsTypeList,cateId: cateId,})
}func (con GoodsTypeAttributeController) DoAdd(c *gin.Context) {title : strings.Trim(c.PostForm(title), )cateId, err1 : models.Int(c.PostForm(cate_id))attrType, err2 : models.Int(c.PostForm(attr_type))attrValue : c.PostForm(attr_value)sort, err3 : models.Int(c.PostForm(sort))if err1 ! nil || err2 ! nil {con.Error(c, 非法请求, /admin/goodsType)return}if title {con.Error(c, 商品类型属性名称不能为空, /admin/goodsTypeAttribute/add?cate_idmodels.String(cateId))return}if err3 ! nil {con.Error(c, 排序值不对, /admin/goodsTypeAttribute/add?cate_idmodels.String(cateId))return}goodsTypeAttr : models.GoodsTypeAttribute{Title: title,CateId: cateId,AttrType: attrType,AttrValue: attrValue,Status: 1,Sort: sort,AddTime: int(models.GetUnix()),}err : models.DB.Create(goodsTypeAttr).Errorif err ! nil {con.Error(c, 增加商品类型属性失败 请重试, /admin/goodsTypeAttribute/add?cate_idmodels.String(cateId))return}con.Success(c, 增加商品类型属性成功, /admin/goodsTypeAttribute?idmodels.String(cateId))
}func (con GoodsTypeAttributeController) Edit(c *gin.Context) {//获取当前要修改数据的idid, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入的参数不正确, /admin/goodsType)return}//获取当前id对应的商品类型属性goodsTypeAttribute : models.GoodsTypeAttribute{Id: id}models.DB.Find(goodsTypeAttribute)//获取所有的商品类型goodsTypeList : []models.GoodsType{}models.DB.Find(goodsTypeList)c.HTML(http.StatusOK, admin/goodsTypeAttribute/edit.html, gin.H{goodsTypeAttribute: goodsTypeAttribute,goodsTypeList: goodsTypeList,})
}func (con GoodsTypeAttributeController) DoEdit(c *gin.Context) {id, err1 : models.Int(c.PostForm(id))title : strings.Trim(c.PostForm(title), )cateId, err2 : models.Int(c.PostForm(cate_id))attrType, err3 : models.Int(c.PostForm(attr_type))attrValue : c.PostForm(attr_value)sort, err4 : models.Int(c.PostForm(sort))if err1 ! nil || err2 ! nil || err3 ! nil {con.Error(c, 非法请求, /admin/goodsType)return}if title {con.Error(c, 商品类型属性名称不能为空, /admin/goodsTypeAttribute/edit?idmodels.String(id))return}if err4 ! nil {con.Error(c, 排序值不对, /admin/goodsTypeAttribute/edit?idmodels.String(id))return}goodsTypeAttr : models.GoodsTypeAttribute{Id: id}models.DB.Find(goodsTypeAttr)goodsTypeAttr.Title titlegoodsTypeAttr.CateId cateIdgoodsTypeAttr.AttrType attrTypegoodsTypeAttr.AttrValue attrValuegoodsTypeAttr.Sort sorterr : models.DB.Save(goodsTypeAttr).Errorif err ! nil {con.Error(c, 修改数据失败, /admin/goodsTypeAttribute/edit?idmodels.String(id))return}con.Success(c, 需改数据成功, /admin/goodsTypeAttribute?idmodels.String(cateId))
}func (con GoodsTypeAttributeController) Delete(c *gin.Context) {id, err1 : models.Int(c.Query(id))cateId, err2 : models.Int(c.Query(cate_id))if err1 ! nil || err2 ! nil {con.Error(c, 传入参数错误, /admin/goodsType)return}goodsTypeAttr : models.GoodsTypeAttribute{Id: id}models.DB.Delete(goodsTypeAttr)con.Success(c, 删除数据成功, /admin/goodsTypeAttribute?idmodels.String(cateId))
}4.创建商品类型属性html以及js在templates/admin/goodsTypeAttribute下创建商品类型属性相关html修改状态以及排序操作代码见:[golang gin框架] 15.Gin 商城项目-封装上传图片方法,轮播图的增删改查以及异步修改状态,数量index.html{{ define admin/goodsTypeAttribute/index.html }}
{{ template admin/public/page_header.html .}}div classcontainer-fluiddiv classrowdiv classpanel panel-defaultdiv classpanel-heading{{.goodsType.Title}} a href/admin/goodsTypeAttribute/add?cate_id{{.cateId}} classbtn btn-primary增加类型属性/a/div!--列表展示--div classtable-responsivetable classtable table-borderedtheadtr classthth属性名称/thth商品类型/thth属性值的录入方式/thth可选值列表/thth增加时间/thth classtext-center排序/thth classtext-center状态/thth classtext-center操作/th/tr/theadtbody{{$cateTitle : .goodsType.Title}}{{range $key,$value : .goodsTypeAttributeList}}trtd{{$value.Title}}/tdtd{{$cateTitle}}/tdtd{{if eq $value.AttrType 1}}单行文本框{{else if eq $value.AttrType 2}}多行文本框{{else if eq $value.AttrType 3}}select下拉框{{end}}/tdtd{{$value.AttrValue}}/tdtd{{UnixToTime $value.AddTime}}/tdtdspan classchSpanNum data-id{{$value.Id}} data-tablegoods_type_attribute data-fieldsort{{$value.Sort}}/span/tdtd classtext-center{{if eq $value.Status 1}}img src/static/admin/images/yes.gif classchStatus data-id{{$value.Id}}data-tablegoods_type_attribute data-fieldstatus /{{else}}img src/static/admin/images/no.gif classchStatus data-id{{$value.Id}}data-tablegoods_type_attribute data-fieldstatus /{{end}}/tdtd classtext-centerahref/admin/goodsTypeAttribute/edit?id{{$value.Id}} 修改/aa classdeletehref/admin/goodsTypeAttribute/delete?id{{$value.Id}}cate_id{{$value.CateId}} 删除/a/td/tr{{end}}/tbody/table/div/div/div
/div/body
/html
{{end}}add.html{{ define admin/goodsTypeAttribute/add.html }}
{{ template admin/public/page_header.html .}}div classcontainer-fluiddiv classrowdiv classpanel panel-defaultdiv classpanel-heading增加商品类型属性/divdiv classpanel-bodydiv classtable-responsive input-formform action/admin/goodsTypeAttribute/doAdd methodpostulli 属性名称 input typetext nametitle //lili 所属类型{{$cateId : .cateId}}select namecate_id idcate_id{{range $key,$value : .goodsTypeList}}option {{if eq $cateId $value.Id}} selected {{end}} value{{$value.Id}}{{$value.Title}}/option {{end}}/select/lili 录入方式input typeradio nameattr_type value1 checkedtrue idtext /labelfortext单行文本框/label input typeradio nameattr_type value2 idtextarea /labelfortextarea多行文本框/label input typeradio nameattr_type value3 idselect /labelforselect从下面的列表中选择一行代表一个可选值/label /lili可选值列表textarea nameattr_value idattr_value cols60 rows8 disableddisabled/textarea/lili span排 序:/span input typetext namesort value10 //lilibr /button typesubmit classbtn btn-primary提交/button/li/ul/form/div/div/div/div
/div
script$(function(){ $(input[nameattr_type).change(function(){// alert($(this).val())if($(this).val()3){$(#attr_value).attr(disabled,false)}else{$(#attr_value).attr(disabled,true)}})
})
/script
/body
/html{{end}}edit.html{{ define admin/goodsTypeAttribute/edit.html }}
{{ template admin/public/page_header.html .}}div classcontainer-fluiddiv classrowdiv classpanel panel-defaultdiv classpanel-heading修改商品类型属性/divdiv classpanel-bodydiv classtable-responsive input-formform action/admin/goodsTypeAttribute/doEdit methodpostinput typehidden nameid value{{.goodsTypeAttribute.Id}} /ulli 属性名称 input typetext nametitle value{{.goodsTypeAttribute.Title}} //lili 所属类型{{$cateId : .goodsTypeAttribute.CateId}}select namecate_id idcate_id{{range $key,$value : .goodsTypeList}}option {{if eq $cateId $value.Id}} selected {{end}} value{{$value.Id}}{{$value.Title}}/option {{end}}/select/lili 录入方式input typeradio nameattr_type value1 {{if eq .goodsTypeAttribute.AttrType 1}} checkedtrue {{end}} idtext /labelfortext单行文本框/label input typeradio nameattr_type value2 {{if eq .goodsTypeAttribute.AttrType 2}} checkedtrue {{end}} idtextarea /labelfortextarea多行文本框/label input typeradio nameattr_type value3 {{if eq .goodsTypeAttribute.AttrType 3}} checkedtrue {{end}} idselect /labelforselect从下面的列表中选择一行代表一个可选值/label /lili可选值列表textarea nameattr_value idattr_value cols60 rows8 {{if ne .goodsTypeAttribute.AttrType 3}} disableddisabled {{end}}{{.goodsTypeAttribute.AttrValue}}/textarea/lili span排 序:/span input typetext namesort value{{.goodsTypeAttribute.Sort}} //lilibr /button typesubmit classbtn btn-primary提交/button/li/ul/form/div/div/div/div
/div
script$(function(){ $(input[nameattr_type).change(function(){// alert($(this).val())if($(this).val()3){$(#attr_value).attr(disabled,false)}else{$(#attr_value).attr(disabled,true)}})
})
/script
/body
/html{{end}}5.配置路由在routes/adminRouters.go下配置商品类型路由//商品类型属性路由adminRouters.GET(/goodsTypeAttribute, admin.GoodsTypeAttributeController{}.Index)adminRouters.GET(/goodsTypeAttribute/add, admin.GoodsTypeAttributeController{}.Add)adminRouters.POST(/goodsTypeAttribute/doAdd, admin.GoodsTypeAttributeController{}.DoAdd)adminRouters.GET(/goodsTypeAttribute/edit, admin.GoodsTypeAttributeController{}.Edit)adminRouters.POST(/goodsTypeAttribute/doEdit, admin.GoodsTypeAttributeController{}.DoEdit)adminRouters.GET(/goodsTypeAttribute/delete, admin.GoodsTypeAttributeController{}.Delete)
[上一节][golang gin框架] 16.Gin 商城项目-商品模块数据表ER图关系分析[下一节][golang gin框架] 18.GoLang 图像处理,剪切图片,生成图片二维码