一:商品列表页:
1:了解返回格式:
{
"code":0,
"errmsg": "ok",
"breadcrumb": { # 面包屑数据
'cat1':'电脑',
'cat2':'电脑整机',
'cat3':'笔记本'
},
"list":[ # skus商品数据
{
"id":"12",
"default_image_url":"http://xxxx",
"name":"apple",
"price":"1289.00"
}
...
],
"count":5 # 分页总数
}
2:配置总路由和子路由:
urlpatterns = [
# ......
re_path(r'', include('apps.goods.urls')),
]
from django.urls import re_path
from . import views
urlpatterns = [
# sku商品列表页面
re_path(r'^list/(?P<category_id>\d+)/skus/$', views.ListView.as_view()),
]
3:编辑goods/views.py实现接口视图
from django.shortcuts import render
from django.http import JsonResponse
from django.views import View
# Paginator:分页器对象,使用该对象可以把一个查询集进行分页
from django.core.paginator import Paginator, EmptyPage
from .models import SKU
from .utils import get_breadcrumb
# Create your views here.
class ListView(View):
def get(self, request, category_id):
# category_id是三级商品分类的id
# 1、提取参数
# 2、校验参数
# 3、数据/业务处理 —— 根据三级分类过滤出sku商品,再分页返回
sort = request.GET.get('ordering')
# skus是一个查询集
skus = SKU.objects.filter(
category_id=category_id,
is_launched=True
).order_by(sort)
page = request.GET.get('page')
page_size = request.GET.get('page_size')
# 根据page和page_size去分页
# 分页流程:
# (1)、构建一个分页器对象
paginator = Paginator(skus, page_size)
# (2)、获取指定页
try:
# cur_page是skus查询集的子集
cur_page = paginator.page(page)
except EmptyPage as e:
print(e)
return JsonResponse({
'code': 400,
'errmsg': '找不到指定页'
})
sku_list = []
for sku in cur_page:
# sku:当前页中的每一个SKU对象
sku_list.append({
'id': sku.id,
'default_image_url': sku.default_image.url,
'name': sku.name,
'price': sku.price
})
# 4、构建响应
return JsonResponse({
'code': 0,
'errmsg': 'ok',
'breadcrumb': get_breadcrumb(category_id),
'list': sku_list,
'count': paginator.num_pages # 总页数
})
二:热销商品接口的实现:
1:了解返回的格式:
第一:返回一个Json数据,
第二:结构
{
"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"
}
]
}
2:视图的实现:goods/views.py
lass HotGoodsView(View):
# 传入商品种类id
def get(self,request,category_id):
#根据商品id查询所有的sku商品
skus = SKU.objects.filter(
category_id = category_id,
# 还在有效期内
is_launched = True
).order_by('-sales')[0:3]# 根据销量降序排列,然后选取前三个
hot_skus = [{'id': sku.id, 'default_image_url': sku.default_image.url, 'name': sku.name, 'price': sku.price} for sku in skus]
return JsonResponse({
"code": 0,
"errmsg": 'ok',
"hot_skus": hot_skus
})
3:配置路由:
from django.urls import re_path
from . import views
urlpatterns = [
# ......
# 热销商品
re_path(r'^hot/(?P<category_id>\d+)/$', views.HotGoodsView.as_view()),
]
三:搜索接口的实现:
1:使用docker快速搭建ES搜索引擎库:
# 1:cd 到ES镜像文件目录:
# 2:导入ES镜像
docker image load -i elasticsearch-ik-2.4.6_docker.tar
# 3:解压ES配置文件到/home目录:
tar -zxvf elasticsearch-2.4.6.tar.gz -C /home
# 4:/home/elasticsearch-2.4.6/config/elasticsearch.yml文件
network.host: 192.168.203.153
# 5: 启动容器:
sudo docker run -dti --name=elasticsearch --network=host -v /home/elasticsearch-2.4.6/config:/usr/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
2:安装拓展工具:
# 1:安装django-haystack拓展
pip install django-haystack -i https://pypi.tuna.tsinghua.edu.cn/simple
# 2:安装ES客户端
pip install elasticsearch==2.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
3:配置文件配置haystack:
INSTALLED_APPS = [
# ......
'haystack', # 用于和es服务器交互的一个中间件
]
# Haystack配置项
HAYSTACK_CONNECTIONS = {
# 默认的es服务器链接
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://192.168.203.153:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
'INDEX_NAME': 'meiduo_mall', # Elasticsearch建立的索引库的名称
},
}
# 当被检索的数据被修改了,haystack就会把新的数据写入es索引库
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
4:使用haystack把模型类数据写入es中:
编辑goods/views.py使用haystack提供的搜索视图函数实现接口
# sku商品搜索接口
from haystack.views import SearchView
class MySearchView(SearchView):
# 当前继承的SearchView是HayStack工具提供的
# 该视图已经实现了一个self.get视图函数,来完成搜索
def create_response(self):
# 重写目的:构建一个json数据返回
# 核心方法self.get_context() --> 和ES通信获取检索的结果
context = self.get_context()
ret_list = []
# 遍历出每一个搜索的结果:SearchResult对象
for result in context['page'].object_list:
# result: SearchResult对象
sku = result.object
ret_list.append({
'id': sku.id,
'name': sku.name,
'price': sku.price,
'default_image_url': sku.default_image.url,
'searchkey': context['query'],
'page_size': context['paginator'].per_page,
'count': context['paginator'].count
})
# JsonResponse默认只能传入字典
# 如果传入的是列表,需要把safe设置为False
return JsonResponse(ret_list, safe=False)
5:编辑goods/urls.py路由映射
from django.urls import re_path
from . import views
urlpatterns = [
# sku搜索,映射的时候无需调用as_view
re_path(r'^search/$', views.MySearchView()),
]
6:在dev.py配置文件中执行后端默认的分页数量
# 可以在 dev.py 中添加如下代码, 用于决定每页显示数据条数:
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
浙公网安备 33010602011771号