美多商城项目之商品模块
1. FastDFS和Docker
1.0 为什么要使用FastDFS和Docker?
因为商品数据分为了商品图片数据(文件),还有商品信息数据(字符串:商品名称,价格,...)
商品图片数据(文件)需要使用单独的文件存储服务器进行管理
文件存储服务器:FastDFS
如何安装并运行文件存储服务器:Docker
商品信息数据(字符串:商品名称,价格,...)可以直接放在MySQL数据库进行管理
1.1 FastDFS
他是一个开源的轻量级分布式文件存储服务器
Client:对接FastDFS的客户端,请求的发起者
Tracker:调度、追踪服务器,调度和追踪Storage服务器的
Storage:物理存储服务器,专门存储文件的
补充:
file_id:是文件在storage上的位置,上传文件成功后由storage返回的,可以用来访问该文件
1.2 Docker
他是应用发布、部署、安装的解决方案。他是以容器技术来发布、部署、安装应用的。
镜像:类似于VM虚拟机中的镜像,是一个独立的文件系统,包含了运行某个应用所依赖的所有环境
容器:类似于VM虚拟机中的资源库,是由镜像创建出来的,每个容器中都会独立的运行一个程序,环境是隔离的。
镜像仓库:托管镜像的,有官方提供的镜像,还有自己创建的镜像
命令相关的:见讲义中的即可,不需要记忆,用到的时候去搜索即可
操作Docker的命令
操作镜像的命令
操作容器的命令
2. 首页广告
2.1 首页广告数据表
商品分类表、商品频道表、频道组表
频道组表和商品频道表是一对多的关联关系
商品频道表和商品分类表是一对一的关联关系
广告类别表、广告内容表
广告类别表和广告内容表是一对多的关联关系
2.2 商品分类:
提示:查询商品分类是极其复杂的,因为商品分类的展示的结构很复杂
重点:分析出要展示的数据的结构,后端要查询并构造的数据要根据前端展示的数据结构而来,从而方便前端渲染
2.3 商品广告
核心思想:查询出所有的广告种类及其中的内容
2.4 自定义Django文件存储类
2.4.1 分析了商品图片加载失败的原因
因为数据库中保存的图片地址仅仅是file_id("group1/M00/00/01/CtM3BVrLmc-AJdVSAAEI5Wm7zaw8639396"),路径不全
2.4.2 解决办法:
我们需要给每张图片地址都拼接一个完整的图片下载地址
"http://image.meiduo.site:8888/group1/M00/00/01/CtM3BVrLmc-AJdVSAAEI5Wm7zaw8639396"
2.4.3 实现方式:
自定义了文件存储类,重写了url方法,并在其中拼接完整的图片下载地址
指定自定义的Django文件存储类 DEFAULT_FILE_STORAGE = '新的文件存储类'
2.4.4 使用自定义的文件存储类
{{ content.image.url }}
3. 商品列表页
3.1 商品数据表
品牌表、SPU表、SKU表、SKU图片表
以上四张表从左至右依次是一对多的关联关系
3.2 排序和分页
3.2.1 排序查询
核心思想:对当前指定分类下未被下架的商品进行排序
实现方式:
skus=SKU.objects.filter(category=category,is_launched=True).order_by(sort_field)
3.2.2 分页查询
创建分页器
paginator = Paginator('要分页的模型列表数据', '每页记录的个数')
查询出指定页码的数据
page_skus = paginator.page('页码')
3.2.3 注意点:
需要先排序再做分页
3.3 面包屑导航
核心思想:使用当前已知的三级分类查询二级分类,在使用二级分类查询一级分类
实现方式:
# 三级查二级(多查一:多方模型类.外键属性名)
cat2 = category.parent
# 二级查一级
cat1 = cat2.parent
3.4 热销排行
核心思想:查询当前指定分类下未被下架的商品,按照销量由高到低排序,并取前两个
实现方式:
SKU.objects.filter(category_id=category_id,is_launched=True).order_by('-sales')[:2]
4. 商品搜索
4.1 全文检索方案Elasticsearch
4.1.1 全文检索:
对数据进行处理,建立包含索引的结构数据,再根据索引进行搜索。
例如:将汉字装进新华字典,并准备索引,再根据索引查找汉字
全文检索方案需要配合 搜索引擎 来实现
4.1.2 搜索引擎:Elasticsearch
对数据库中的数据进行一遍预处理,单独建立起一份索引结构数据
进行全文检索时,将关键字在索引数据中进行快速对比查找,进而找到数据的真实存储位置
4.2 Haystack扩展建立索引
4.2.1 准备Haystack扩展
安装Haystack扩展
Haystack注册应用和路由
Haystack配置
4.2.1 Haystack扩展建立索引
创建索引类
创建text字段索引值模板文件
手动生成初始索引
4.3 渲染商品搜索结果
重点:我们需要知道Haystack在搜索成功之后,向美多商城返回了哪些有些的数据,再根据返回的数据渲染页面
数据:
query:搜索关键字
paginator:分页器
page:当前页的page对象(遍历page中的对象,可以得到result对象)
5. 商品详情页
5.1 查询和渲染SKU详情信息
5.1.1 渲染SKU信息(商品名称,副标题,价格,图片,...)
核心思想:使用sku_id查询出SKU信息即可
5.1.2 渲染SPU信息(商品详情、规格包装、售后服务)
核心思想:使用sku查询出对应的spu信息即可
5.2 统计分类商品访问量
核心思想:
统计当天某种分类的商品访问的总量
每种分类每天只统计一条记录
实现逻辑:
判断当天指定的分类是否有访问记录
如果没有访问记录:新建一条空记录,并保存访问量
如果有访问记录:直接在原有的访问量的基础之上累加访问量
5.3 用户浏览记录
5.3.1 设计浏览记录存储方案
存储数据:sku_id
存储位置:redis
存储类型:list
存储逻辑:
先确定需求:
1.浏览记录SKU信息不能重复
2.最近一次浏览的商品排在最前面
3.每个用户的浏览记录最多存储五个商品
再确定存储逻辑
1.先去重:lrem
2.再添加:lpush
3.最后截取:ltrim
5.3.2 保存用户浏览记录
5.3.3 查询用户浏览记录