免费网站建设平台 iis,什么网站做效果图最多,买网站多少钱,新浪微博登录网页版配置清除缓存 当进入前台首页时,会缓存对应的商品相关数据,这时,如果后台修改了商品的相关数据,缓存中的对应数据并没有随之发生改变,这时就需要需改对应的缓存数据,这里有两种方法: 方法一 在管理后台操作直接清除缓存中的所有数据,当再次访问前台首页时,就会先从数据库中获取… 配置清除缓存 当进入前台首页时,会缓存对应的商品相关数据,这时,如果后台修改了商品的相关数据,缓存中的对应数据并没有随之发生改变,这时就需要需改对应的缓存数据,这里有两种方法: 方法一 在管理后台操作直接清除缓存中的所有数据,当再次访问前台首页时,就会先从数据库中获取数据,然后缓存到redis中,代码如下: (1).界面 点击 清除缓存 按钮,直接清除缓存驱动中的所有数据 (2).增加 清除缓存 按钮 在templates/admin/main/index.html页面,增加 清除缓存 按钮 ul classnav navbar-nav navbar-rightlia欢迎您,{{.username}}/a/lilia href/admin/flushAll清除缓存/alia href/admin/loginOut安全退出/a/li
/ul (3).增加路由 在routers/admin/adminRouter.go中增加 清除缓存 路由 adminRouters.GET(/flushAll, admin.MainController{}.FlushAll) (4).增加清除缓存方法 在controllers/admin/MainController.go中增加清除缓存的方法 //清除缓存
func (con MainController) FlushAll(c *gin.Context) {models.RedisCache.FlushAll()con.Success(c, 清除缓存成功, /admin)
} 在models /redisCache.go中增加清除缓存方法 //清除缓存
func (r RedisCache) FlushAll() {if redisEnable {RedisDb.FlushAll(ctxRedis)}
} 方法二 在管理后台修改商品相关数据时,就去修改对应的缓存数据,代码:略 2.分类页面数据展示 当从首页点击 商品分类,进入商品分类的 商品展示页面时,会存在和首页共同的 公共数据 顶部导航、中间导航、左侧分类,那么就可以把公共的代码分离出来,放到 基础控制器(BaseController.go)中,实现 代码的复用; 在商品分类的商品展示页面 展示分类的对应商品,以及 筛选对应分类的商品,和对商品进行 分页操作 1).界面 首页界面 商品分类对应的商品页面: 该页面和首页都有共同的 公共数据 顶部导航、中间导航、左侧分类 商品列表 2).代码展示 (1).html 拆分publibc/page_header.html,把中部导航代码单独成一个文件middle_nav.html index.html中增加 中部导航 代码 创建product/list.html商品页面文件 page_header.html 拆分publibc/page_header.html,把中部导航代码单独成一个文件middle_nav.html !-- 相当于给模板定义一个名字, define end 必须成对出现 --
{{ define frontend/public/page_header.html }}!DOCTYPE htmlhtmlheadmeta charsetUTF-8meta nameauthor contentorder by dede58.com/title小米商城/titlelink relstylesheet typetext/css href/static/frontend/css/style.csslink relstylesheet href/static/frontend/css/swiper.min.cssscript src/static/frontend/js/jquery-1.10.1.js/scriptscript src/static/frontend/js/swiper.min.js/scriptscript src/static/frontend/js/base.js /script/headbody!-- start header 顶部导航 --headerdiv classtop centerdiv classleft flul!--获取长度,并计算,看看是否显示最后的 | 画线--{{ $temp : .topNavList | len }}{{ $navLen : Sub $temp 1 }}{{range $key, $value : .topNavList}}lia href{{$value.Link}}{{if eq $value.IsOpennew 1 }} target_blank {{end}} {{$value.Title}}/a/li{{if lt $key $navLen}}li|/li{{end}}{{end}}div classclear/div/ul/divdiv classright frdiv classgouwuche fra href购物车/a/divdiv classfrullia href./login.html target_blank登录/a/lili|/lilia href./register.html target_blank 注册/a/lili|/lilia href消息通知/a/li/ul/divdiv classclear/div/divdiv classclear/div/div/header!--end header --
{{end}} list.html 创建product/list.html商品页面文件 {{ define frontend/public/middle_nav.html }}!-- 中间导航start banner_x --div classbanner_x centera href/ target_blankdiv classlogo fl/div/adiv classnav flul classclearfix idnav_listli classlink-categorya href#全部商品分类/adiv classbanner_y centerdiv classnavul{{range $key,$value : .goodsCateList}}li!--判断点击分类是否跳转到一个新的链接,如果不是,则跳转到对应的分类商品页面--{{if eq $value.Link }}a hrefcategory{{$value.Id}} target_blank{{$value.Title}}/a{{else}}a href{{$value.Link}} target_blank{{$value.Title}}/a{{end}}div classpopol classcate_list clear{{range $k,$v : $value.GoodsCateItems}}lidiv classxuangou_left{{if eq $v.Link }}a hrefcategory{{$v.Id}} target_blankclassclearfixdiv classimg flimgsrc{{$v.CateImg | FormatImg}}alt{{$v.Title}}/divspan classfl{{$v.Title}}/span/a{{else}}a href{{$v.Link}} target_blank classclearfixdiv classimg flimgsrc{{$v.CateImg | FormatImg}}alt{{$v.Title}}/divspan classfl{{$v.Title}}/span/a{{end}}/div/li{{end}}/ol/div/li{{end}}/ul/div/div/li{{range $key,$value : .middleNavList}}lia href# target_blank{{$value.Title}}/aol classchildren-list clearfix{{range $k,$v : $value.GoodsItems}}lia href#img src{{$v.GoodsImg | FormatImg}} alt{{$v.Title}}/p{{$v.Price}}元/p/a/li{{end}}/ol/li{{end}}/ul/divdiv classsearch frform action methodpostdiv classtext flinput typetext classshuru placeholder6nbsp;MIX现货/divdiv classsubmit flinput typesubmit classsousuo value搜索//divdiv classclear/div/formdiv classclear/div/div/div!-- end banner_x --
{{end}} index.html 商品首页增加 中部导航 代码, 因为page_header.html中的中部导航代码没有了,已经封装成middle_nav.html代码了,而首页的商品分类和商品页面的商品分类还有点区别,故不会导入public/middle_nav.html中的代码,所以会直接增加 中部导航 代码 {{ define frontend/index/index.html }}{{template frontend/public/page_header.html .}}!-- start banner_x 中部导航 --div classbanner_x centera href./index.html target_blankdiv classlogo fl/div/aa hrefdiv classad_top fl/div/adiv classnav flul classclearfix idnav_list{{range $key, $value : .middleNavList }}lia href{{$value.Link}} target_blank{{$value.Title}}/aol classchildren-list clearfix{{range $k, $v : $value.GoodsItems }}lia href#img src{{$v.GoodsImg | FormatImg }} /p{{$v.Price}}/p/a/li{{end}}/ol/li{{end}}/ul/divdiv classsearch frform action methodpostdiv classtext flinput typetext classshuru placeholder小米6nbsp;小米MIX现货/divdiv classsubmit flinput typesubmit classsousuo value搜索//divdiv classclear/div/formdiv classclear/div/div/div!-- end banner_x --!-- 商品分类 start banner_y --div classbanner_y centerdiv classnavul{{range $key, $value : .goodsCateList }}li{{if eq $value.Link }}a hrefcategory{{$value.Id}} target_blank{{$value.Title}}/a{{else}}a href{{$value.Link}} target_blank{{$value.Title}}/a{{end}}div classpopol classcate_list clear{{range $k, $v : $value.GoodsCateItems}}lidiv classxuangou_left{{if eq $v.Link }}a hrefcategory{{$v.Id}} target_blankclassclearfixdiv classimg flimgsrc{{$v.CateImg | FormatImg}}alt{{$v.Title}}/divspan classfl{{$v.Title}}/span/a{{else}}a href{{$v.Link}} target_blank classclearfixdiv classimg flimgsrc{{$v.CateImg | FormatImg}}alt{{$v.Title}}/divspan classfl{{$v.Title}}/span/a{{end}}/div/li{{end}}/ol/div/li{{end}}/ul/div!--轮播图--div classswiper-containerdiv classswiper-wrapper{{range $key, $value : .focusList}}div classswiper-slidea href{{$value.Link}} target_blankimg src{{$value.FocusImg | FormatImg}} alt{{$value.Title}} //a/div{{end}}/div!-- Add Arrows --div classswiper-button-next/divdiv classswiper-button-prev/div/div/div !-- 商品分类end --div classsub_banner centerdiv classsidebar fldiv classfla hrefimg src/static/frontend/image/hjh_01.gif/a/divdiv classfla hrefimg src/static/frontend/image/hjh_02.gif/a/divdiv classfla hrefimg src/static/frontend/image/hjh_03.gif/a/divdiv classfla hrefimg src/static/frontend/image/hjh_04.gif/a/divdiv classfla hrefimg src/static/frontend/image/hjh_05.gif/a/divdiv classfla hrefimg src/static/frontend/image/hjh_06.gif/a/divdiv classclear/div/divdiv classdatu fla hrefimg src/static/frontend/image/hongmi4x.png alt/a/divdiv classdatu fla hrefimg src/static/frontend/image/xiaomi5.jpg alt/a/divdiv classdatu fra hrefimg src/static/frontend/image/pinghengche.jpg alt/a/divdiv classclear/div/div!-- end banner --!-- 手机 --div classcategory_item wdiv classtitle center手机/divdiv classmain centerdiv classcategory_item_leftimg srcstatic/itying/image/shouji.jpg alt手机/divdiv classcategory_item_right{{range $key,$value : .phoneList}}div classhot fldiv classxinpinspan stylebackground:#fff/span/divdiv classtua href#img src{{$value.GoodsImg | FormatImg}}/a/divdiv classmiaoshua href#{{$value.Title}}/a/divdiv classjiage{{$value.Price}}元/divdiv classpingjia372人评价/divdiv classpiaoa hrefspan{{SubStr $value.SubTitle 0 4}}/span/a/div/div{{end}}/div/div/div{{template frontend/public/page_footer.html .}}/body
/html
{{end}} (2).增加商品分类页面路由 defaultRouters.GET(/category:id, frontend.ProductController{}.Category) (3).基础控制器 在基础控制器BaseController.go中创建公共方法: 加载公共模板方法Render() package frontend//基础控制器import (github.com/gin-gonic/gingorm.io/gormgoshop/modelsnet/httpstrings
)type BaseController struct{}/*
加载公共模板方法
tpl string 模板
data map 请求的数据*/
func (con BaseController) Render(c *gin.Context, tpl string, data map[string]interface{}) {//实例化redisCache结构体redisCache : models.RedisCache{}//获取顶部导航列表topNavList : []models.Nav{}//判断redis中是否存在数据if hasTopNavList : redisCache.Get(topNavList, topNavList); !hasTopNavList { //不存在数据,则从数据中获取数据,并把数据保存到redismodels.DB.Where(status 1 AND position 1).Find(topNavList)redisCache.Set(topNavList, topNavList, 3600)}//获取分类数据goodsCateList : []models.GoodsCate{}if hasGoodsCateList : redisCache.Get(goodsCateList, goodsCateList); !hasGoodsCateList {//获取分类列表以及下级分类,并进行排序models.DB.Where(pid ? AND status ?, 0, 1).Order(sort DESC).Preload(GoodsCateItems, func(db *gorm.DB) *gorm.DB {return db.Where(goods_cate.status 1).Order(goods_cate.sort DESC)} ).Find(goodsCateList)redisCache.Set(goodsCateList, goodsCateList, 3600)}//获取中间导航middleNavList : []models.Nav{}if hasMiddleNavList : redisCache.Get(middleNavList, middleNavList); !hasMiddleNavList {models.DB.Where(status ? AND position ? , 1, 2).Find(middleNavList)//循环,获取中间导航对应的商品数据for i: 0; i len(middleNavList);i{//获取管理商品//替换字符串中的中文逗号strings.ReplaceAll()relation : strings.ReplaceAll(middleNavList[i].Relation, , ,)//把字符串转换成切片relationIds : strings.Split(relation, ,)//获取对应的商品信息goodsList : []models.Goods{}models.DB.Where(status ?, 1).Where(id in ?, relationIds).Select(id, title, goods_img, price).Find(goodsList)middleNavList[i].GoodsItems goodsList}redisCache.Set(middleNavList, middleNavList, 3600)}renderData : gin.H{topNavList: topNavList,goodsCateList: goodsCateList,middleNavList: middleNavList,}for key, v : range data {renderData[key] v}c.HTML(http.StatusOK, tpl, renderData)
} (4).商品控制器 创建ProductController.go控制器,该控制器与商品相关 package frontend//商品相关import (github.com/gin-gonic/gingoshop/modelsmath
)type ProductController struct {//extend 基础控制器BaseController
}// 根据商品分类获取分类下面的所有商品数据
func (con ProductController) Category(c *gin.Context) {//获取分类idcateId, _ : models.Int(c.Param(id))//当前页page, _ : models.Int(c.Query(page))if page 0 {page 1}//每一页显示的数量pageSize : 2//获取当前分类curCate : models.GoodsCate{}models.DB.Where(id ? , cateId).Find(curCate)//判断当前分类是否顶级分类,如果是,则获取对应的二级分类,如果不是,则获取对应的兄弟分类subCate : []models.GoodsCate{}var tempSlice []intif curCate.Pid 0 { // 当前分类是顶级分类,获取对应的二级分类models.DB.Where(pid ?, cateId).Find(subCate)//把二级分类id放到切片中for i : 0; i len(subCate); i {tempSlice append(tempSlice, subCate[i].Id)}} else { // 当前分类是二级分类,获取对应的兄弟分类models.DB.Where(pid ?, curCate.Pid).Find(subCate)}//把请求的分类id放入切片tempSlice append(tempSlice, cateId)//通过上面的分类id,获取商品相关数据goodsList : []models.Goods{}where : cate_id in ?models.DB.Where(where, tempSlice).Where(status ?, 1).Offset((page - 1) * pageSize).Limit(pageSize).Find(goodsList)//获取总数量var count int64models.DB.Where(where, tempSlice).Table(goods).Count(count)//定义请求的模板tpl : frontend/product/list.htmlcon.Render(c, tpl, gin.H{goodsList: goodsList, // 商品列表subCate: subCate, // 选择分类下面的子分类currentCate: curCate, // 当前分类page: page, //当前页码数totalPages: math.Ceil(float64(count) / float64(pageSize)), // 总页面数})
}[上一节][golang gin框架] 24.Gin 商城项目-redis讲解以及操作