四、商品列表页

4.1 商品列表页分析

4.1.1. 商品列表页组成结构分析

1.商品频道分类

  • 已经提前封装在contents.utils.py文件中,直接调用即可。

2.面包屑导航

  • 可以使用三级分类ID,查询出该类型商品的三级分类数据。

3.排序和分页

  • 无论如何排序和分页,商品的分类不能变。
  • 排序时需要知道当前排序方式。
  • 分页时需要知道当前分页的页码,且每页五条商品记录。

4.热销排行

  • 热销排行中的商品分类要和排序、分页的商品分类一致。
  • 热销排行是查询出指定分类商品销量前二的商品。
  • 热销排行使用Ajax实现局部刷新的效果。

4.1.2. 商品列表页接口设计和定义

1.请求方式

选项 方案
请求方法 GET
请求地址 /list/(?P<category_id>\d+)/(?P<page_num>\d+)/?sort=排序方式
# 按照商品创建时间排序
http://www.meiduo.site:8000/list/115/1/?sort=default
# 按照商品价格由低到高排序
http://www.meiduo.site:8000/list/115/1/?sort=price
# 按照商品销量由高到低排序
http://www.meiduo.site:8000/list/115/1/?sort=hot

总路由:

子路由:

from django.conf.urls import url
from . import viewsurlpatterns = [#  商品列表url(r'^list/(?P<category_id>\d+)/(?P<page_num>\d+)/$', views.ListView.as_view(), name='list'),]

2.请求参数:路径参数 和 查询参数

参数名 类型 是否必传 说明
category_id string 商品分类ID,第三级分类
page_num string 当前页码
sort string 排序方式

3.响应结果:HTML

list.html

【把list.html和list.js文件复制到项目中】

4.接口定义

goods.views.py

from django.shortcuts import render
from django.views import View# Create your views here.
class ListView(View):"""商品列表页"""def get(self, request, category_id, page_num):"""提供商品列表页"""return render(request, 'list.html')

4.2 列表页面包屑导航

重要提示:路径参数category_id是商品第三级分类

4.2.1. 查询列表页面包屑导航数据

提示: 对包屑导航数据的查询进行封装,方便后续直接使用。

goods.utils.py

def get_breadcrumb(category):"""获取面包屑导航:param category: 商品类别:return: 面包屑导航字典"""breadcrumb = dict(cat1='',cat2='',cat3='')if category.parent is None:# 当前类别为一级类别breadcrumb['cat1'] = categoryelif category.subs.count() == 0:  # 此时若没有子集,则为3级# 当前类别为三级breadcrumb['cat3'] = categorycat2 = category.parentbreadcrumb['cat2'] = cat2breadcrumb['cat1'] = cat2.parentelse:# 当前类别为二级breadcrumb['cat2'] = categorybreadcrumb['cat1'] = category.parentreturn breadcrumb

views.py

from goods.models import GoodsCategory, SKU
from django import http
from contents.utils import get_categories
from goods.utils import get_breadcrumbclass ListView(View):"""商品列表页"""def get(self, request, category_id, page_num):"""提供商品列表页"""# 判断category_id是否正确try:category = models.GoodsCategory.objects.get(id=category_id)except models.GoodsCategory.DoesNotExist:return http.HttpResponseNotFound('GoodsCategory does not exist')# 查询商品频道分类categories = get_categories()# 查询面包屑导航breadcrumb = get_breadcrumb(category)# 渲染页面context = {'categories':categories,'breadcrumb':breadcrumb}return render(request, 'list.html', context)

4.2.2. 渲染列表页面包屑导航数据

list.html

<div class="breadcrumb"><a href="{{ breadcrumb.cat1.url }}">{{ breadcrumb.cat1.name }}</a><span>></span><a href="javascript:;">{{ breadcrumb.cat2.name }}</a><span>></span><a href="javascript:;">{{ breadcrumb.cat3.name }}</a>
</div>

4.3 列表页分页和排序

# 按照商品创建时间排序
http://www.meiduo.site:8000/list/115/1/?sort=default
# 按照商品价格由低到高排序
http://www.meiduo.site:8000/list/115/1/?sort=price
# 按照商品销量由高到低排序
http://www.meiduo.site:8000/list/115/1/?sort=hot

4.3.1. 查询列表页分页和排序数据

from django.core.paginator import Paginator, EmptyPageclass ListView(View):"""商品列表页"""def get(self, request, category_id, page_num):"""提供商品列表页"""# 判断category_id是否正确try:category = models.GoodsCategory.objects.get(id=category_id)except models.GoodsCategory.DoesNotExist:return http.HttpResponseNotFound('GoodsCategory does not exist')# 接收sort参数:如果用户不传,就是默认的排序规则sort = request.GET.get('sort', 'default')# 查询商品频道分类categories = get_categories()# 查询面包屑导航breadcrumb = get_breadcrumb(category)# 按照排序规则查询该分类商品SKU信息if sort == 'price':# 按照价格由低到高sort_field = 'price'elif sort == 'hot':# 按照销量由高到低sort_field = '-sales'else:# 'price'和'sales'以外的所有排序方式都归为'default'sort = 'default'sort_field = 'create_time'skus = models.SKU.objects.filter(category=category, is_launched=True).order_by(sort_field)# 创建分页器:每页N条记录paginator = Paginator(skus, constants.GOODS_LIST_LIMIT)# 获取每页商品数据try:page_skus = paginator.page(page_num)except EmptyPage:# 如果page_num不正确,默认给用户404return http.HttpResponseNotFound('empty page')# 获取列表页总页数total_page = paginator.num_pages# 渲染页面context = {'categories': categories,   # 频道分类'breadcrumb': breadcrumb,   # 面包屑导航'sort': sort,               # 排序字段'category': category,       # 第三级分类'page_skus': page_skus,     # 分页后数据'total_page': total_page,   # 总页数'page_num': page_num,       # 当前页码}return render(request, 'list.html', context)

4.3.2. 渲染列表页分页和排序数据

1.渲染分页和排序数据

<div class="r_wrap fr clearfix"><div class="sort_bar"><a href="{{ url('goods:list', args=(category.id, page_num)) }}?sort=default" {% if sort == 'default' %}class="active"{% endif %}>默认</a><a href="{{ url('goods:list', args=(category.id, page_num)) }}?sort=price" {% if sort == 'price' %}class="active"{% endif %}>价格</a><a href="{{ url('goods:list', args=(category.id, page_num)) }}?sort=hot" {% if sort == 'hot' %}class="active"{% endif %}>人气</a></div><ul class="goods_type_list clearfix">{% for sku in page_skus %}<li><a href="detail.html"><img src="{{ sku.default_image.url }}"></a><h4><a href="detail.html">{{ sku.name }}</a></h4><div class="operate"><span class="price">¥{{ sku.price }}</span><span class="unit">台</span><a href="#" class="add_goods" title="加入购物车"></a></div></li>{% endfor %}</ul>
</div>

2.列表页分页器

准备分页器标签

<div class="r_wrap fr clearfix">......<div class="pagenation"><div id="pagination" class="page"></div></div>
</div>

# 导入样式时放在最前面导入
<link rel="stylesheet" type="text/css" href="{{ static('css/jquery.pagination.css') }}">

准备分页器交互  【放在最下方】

<script type="text/javascript" src="{{ static('js/jquery.pagination.min.js') }}"></script>
<script type="text/javascript">$(function () {$('#pagination').pagination({currentPage: {{ page_num }},totalPage: {{ total_page }},callback:function (current) {{#location.href = '/list/115/1/?sort=default';#}location.href = '/list/{{ category.id }}/' + current + '/?sort={{ sort }}';}})});
</script>

4.4 列表页热销排行

【正在上架的,当前类别分类】【不用登录也会看到】

根据路径参数category_id查询出该类型商品销量前二的商品。

使用Ajax实现局部刷新的效果。

4.4.1. 查询列表页热销排行数据

1.请求方式

选项 方案
请求方法 GET
请求地址 /hot/(?P<category_id>\d+)/
#  热销排行url(r'^hot/(?P<category_id>\d+)/$', views.HotGoodsView.as_view()),

2.请求参数:路径参数

参数名 类型 是否必传 说明
category_id string 商品分类ID,第三级分类

3.响应结果:JSON

字段 说明
code 状态码
errmsg 错误信息
hot_skus[ ] 热销SKU列表
id SKU编号
default_image_url 商品默认图片
name 商品名称
price 商品价格
{"code":"0","errmsg":"OK","hot_skus":[{"id":6,"default_image_url":"http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrRbI2ARekNAAFZsBqChgk3141998","name":"Apple iPhone 8 Plus (A1864) 256GB 深空灰色 移动联通电信4G手机","price":"7988.00"},{"id":14,"default_image_url":"http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrRdMSAaDUtAAVslh9vkK04466364","name":"华为 HUAWEI P10 Plus 6GB+128GB 玫瑰金 移动联通电信4G手机 双卡双待","price":"3788.00"}]
}

4.接口定义和实现

from meiduo_mall.utils.response_code import RETCODE# Create your views here.
class HotGoodsView(View):"""商品热销排行"""def get(self, request, category_id):"""提供商品热销排行JSON数据"""# 根据销量倒序skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by('-sales')[:2]# 序列化hot_skus = []for sku in skus:hot_skus.append({'id': sku.id,'default_image_url': sku.default_image.url,'name': sku.name,'price': sku.price})return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'hot_skus': hot_skus})

4.4.2. 渲染列表页热销排行数据

1.模板数据category_id传递到Vue.js

<script type="text/javascript">let category_id = "{{ category.id }}";
</script>
data: {category_id: category_id,
},

2.Ajax请求商品热销排行JSON数据

get_hot_skus(){if (this.category_id) {let url = '/hot/'+ this.category_id +'/';axios.get(url, {responseType: 'json'}).then(response => {this.hot_skus = response.data.hot_skus;for(let i=0; i<this.hot_skus.length; i++){this.hot_skus[i].url = '/detail/' + this.hot_skus[i].id + '/';}}).catch(error => {console.log(error.response);})}
},

3.渲染商品热销排行界面

<div class="new_goods" v-cloak><h3>热销排行</h3><ul><li v-for="sku in hot_skus"><a :href="sku.url"><img :src="sku.default_image_url"></a><h4><a :href="sku.url">[[ sku.name ]]</a></h4><div class="price">¥[[ sku.price ]]</div></li></ul>
</div>

上面代码写好后,运行可能会报下面的错误:

解决办法:

美多商城之商品(商品列表页)相关推荐

  1. 美多商城项目:商品数据库表设计、准备商品数据、首页广告、商品列表页

    一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍 SPU = Standard Product Unit (标准产品单位) SPU是商 ...

  2. 【愚公系列】2022年01月 Django商城项目 24-商品列表页功能实现

    文章目录 一.商品列表页功能实现 1.后台查询代码 二.面包屑信息展示 1.前台html代码 2.实际效果 三.列表页信息展示 1.前台html代码 2.实际效果 一.商品列表页功能实现 1.后台查询 ...

  3. 商品管理列表页优化 实现全屏效果

    日常需求: https://xiaolv.qima-inc.com/#/demand/search?show=true&ids=37128 商品管理页 实现全屏 通过使用js 的api : e ...

  4. 品优购商城——列表页

    效果图: 列表页文件 list.html <!DOCTYPE html> <html lang="en"> <head><meta cha ...

  5. Django框架之美多商城项目

    后续技术类文档更新到微信公众号-------->>喜欢的扫码关注 美多商城 1. 项目的准备 - 分析商业模式:B2C- 开发流程- 项目的架构- 创建工程- 配置 2. 登录模块 2.1 ...

  6. 商城项目商品列表页的渲染实现(含动图)

    有了v-for循环,渲染商品列表简直不要太方便了,以前写一个商品列表页要一天,现在只需要几分钟,除了模拟数据会耗一点时间.这里可以了解下Mock模拟数据,它可使前端工程师独立于后端进行开发,在前端可以 ...

  7. 微信小程序商城系列之商品列表页(一)

    微信小程序商城列表页 wxml: <view class='list'><block wx:for='{{dataList}}' wx:key='list' wx:for-item= ...

  8. 阿语python美多商城-商品-商品详情页之第6.6.1节商品详情页分析和准备

    商品详情页分析和准备 1. 商品详情页组成结构分析 1.商品频道分类 已经提前封装在contents.utils.py文件中,直接调用方法即可. 2.面包屑导航 已经提前封装在goods.utils. ...

  9. 美多商城之商品(商品详情页)

    六.商品详情页 6.1 商品详情页分析和准备 6.1.1. 商品详情页组成结构分析 1.商品频道分类 已经提前封装在contents.utils.py文件中,直接调用方法即可. 2.面包屑导航 已经提 ...

最新文章

  1. Jupyter Notebook中cell操作
  2. return view前端怎么获取_前端判断上传图片格式
  3. 复杂的动态布尔表达式性能评估(1)--Antlr4实现
  4. 无人机-1认识无人机
  5. android rsa解密前面带乱码,C#rsa解密的解出来的结果乱码
  6. java里程碑之泛型--泛型基本语法
  7. 剑指offer(C++)-JZ7:重建二叉树(数据结构-树)
  8. html转PDF并添加水印
  9. numpy:数组累乘
  10. Unity全局音量控制
  11. 如何恢复、打开、开启默认共享ipc$ c$ Dameware安装出错
  12. 今日芯声 | 每天徒步7公里找信号?印度不愧是开挂民族
  13. MACD底背离选股公式——通达信、同花顺
  14. 基于MXNET实现的年龄性别识别
  15. 什么是 Python ?聊一聊Python程序员找工作的六大技巧
  16. 微信小游戏保存自定义分享图到相册实例
  17. Vue2.和Vue3.生命周期的区别,对比。 详解生命周期中的每个钩子函数,setup,
  18. 时间分治(cdq分治)
  19. 世界五百强中国上榜公司首次超过美国;现代汽车发布电动汽车品牌IONIQ | 美通企业日报...
  20. 二维平面多点电荷电力线与等位面及三维空间多点电荷电力线的计算机仿真

热门文章

  1. AI和大数据如何落地智能城市?京东城市这6篇论文必读 | KDD 2019
  2. 中方控股的Arm合资公司开始运营,还要在国内IPO
  3. 何恺明团队推出Mask^X R-CNN,将实例分割扩展到3000类
  4. Windows 给力!可以扔掉 Linux 虚拟机了!
  5. 远程办公,为什么一直不被公司普遍接受?
  6. 成为算法工程师的路上,掌握什么思维会让自我提升突飞猛进?
  7. 厦门大学宋宁宇:统计学专业到蚂蚁风控岗!
  8. 15万奖金强化学习赛事!Go-Bigger多智能体决策智能挑战赛来了!
  9. PyTorch Cookbook(常用代码合集)
  10. KDD Cup 2020 多模态检索赛道:数据分析