飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一:商品列表页:

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
posted on 2020-09-09 23:34  飞行的猪哼哼  阅读(50)  评论(0)    收藏  举报