二、购物车管理

2.1 添加购物车

提示:在商品详情页添加购物车使用局部刷新的效果。

新建carts子应用

2.1.1. 添加购物车接口设计和定义

1.请求方式

选项 方案
请求方法 POST
请求地址 /carts/

总路由:

    #  cartsurl(r'^', include('carts.urls', namespace='carts')),

子路由:

from django.conf.urls import url
from . import viewsurlpatterns = [#  购物车管理url(r'^carts/$', views.CartsView.as_view(), name='info'),
]

2.请求参数:JSON  【因为前端发送的ajax请求】

参数名 类型 是否必传 说明
sku_id int 商品SKU编号
count int 商品数量
selected bool 是否勾选

3.响应结果:JSON

字段 说明
code 状态码
errmsg 错误信息

4.后端接口定义

from django.shortcuts import render
from django.views import View# Create your views here.
class CartsView(View):"""购物车管理"""def post(self, request):"""添加购物车"""#  接收和校验参数#  判断用户是否登录user = request.userif user.is_authenticated:#  用户已经登录,操作redis购物车passelse:#  用户未登录,操作cookie购物车pass

2.1.2. 添加购物车后端逻辑实现

1.接收和校验参数

class CartsView(View):"""购物车管理"""def post(self, request):"""添加购物车"""# 接收参数json_dict = json.loads(request.body.decode())sku_id = json_dict.get('sku_id')count = json_dict.get('count')selected = json_dict.get('selected', True)# 判断参数是否齐全if not all([sku_id, count]):return http.HttpResponseForbidden('缺少必传参数')# 判断sku_id是否存在try:models.SKU.objects.get(id=sku_id)except models.SKU.DoesNotExist:return http.HttpResponseForbidden('商品不存在')# 判断count是否为数字try:count = int(count)except Exception:return http.HttpResponseForbidden('参数count有误')# 判断selected是否为bool值if selected:if not isinstance(selected, bool):return http.HttpResponseForbidden('参数selected有误')# 判断用户是否登录user = request.userif user.is_authenticated:# 用户已登录,操作redis购物车passelse:# 用户未登录,操作cookie购物车pass

2.添加购物车到Redis

from django_redis import get_redis_connection
from meiduo_mall.utils.response_code import RETCODEclass CartsView(View):"""购物车管理"""def post(self, request):"""添加购物车"""# 接收和校验参数......# 判断用户是否登录user = request.userif user.is_authenticated:# 用户已登录,操作redis购物车redis_conn = get_redis_connection('carts')pl = redis_conn.pipeline()# 新增购物车数据pl.hincrby('carts_%s' % user.id, sku_id, count)# 新增选中的状态if selected:pl.sadd('selected_%s' % user.id, sku_id)# 执行管道pl.execute()# 响应结果return http.JsonResponse({'code': RETCODE.OK, 'errmsg': '添加购物车成功'})else:# 用户未登录,操作cookie购物车pass

3.添加购物车到cookie

import pickle
import base64
from meiduo_mall.utils import constantsclass CartsView(View):"""购物车管理"""def post(self, request):"""添加购物车"""# 接收和校验参数......# 判断用户是否登录user = request.userif user.is_authenticated:# 用户已登录,操作redis购物车......else:# 用户未登录,操作cookie购物车cart_str = request.COOKIES.get('carts')# 如果用户操作过cookie购物车if cart_str:# 将cart_str转成bytes,再将bytes转成base64的bytes,最后将bytes转字典cart_dict = pickle.loads(base64.b64decode(cart_str.encode()))else:  # 用户从没有操作过cookie购物车cart_dict = {}# 判断要加入购物车的商品是否已经在购物车中,如有相同商品,累加求和,反之,直接赋值if sku_id in cart_dict:# 累加求和origin_count = cart_dict[sku_id]['count']count += origin_countcart_dict[sku_id] = {'count': count,'selected': selected}# 将字典转成bytes,再将bytes转成base64的bytes,最后将bytes转字符串cookie_cart_str = base64.b64encode(pickle.dumps(cart_dict)).decode()# 创建响应对象response = http.JsonResponse({'code': RETCODE.OK, 'errmsg': '添加购物车成功'})# 响应结果并将购物车数据写入到cookieresponse.set_cookie('carts', cookie_cart_str, max_age=constants.CARTS_COOKIE_EXPIRES)return response

2.2  展示购物车

2.2.1. 展示购物车接口设计和定义

1.请求方式

选项 方案
请求方法 GET
请求地址 /carts/

2.请求参数:

3.响应结果:HTML

cart.html

4.后端接口定义

class CartsView(View):"""购物车管理"""def get(self, request):"""展示购物车"""user = request.userif user.is_authenticated:# 用户已登录,查询redis购物车passelse:# 用户未登录,查询cookies购物车pass

2.2.2. 展示购物车后端逻辑实现

1.查询Redis购物车

class CartsView(View):"""购物车管理"""def get(self, request):"""展示购物车"""user = request.userif user.is_authenticated:# 用户已登录,查询redis购物车redis_conn = get_redis_connection('carts')# 获取redis中的购物车数据redis_cart = redis_conn.hgetall('carts_%s' % user.id)# 获取redis中的选中状态cart_selected = redis_conn.smembers('selected_%s' % user.id)# 将redis中的数据构造成跟cookie中的格式一致,方便统一查询cart_dict = {}for sku_id, count in redis_cart.items():cart_dict[int(sku_id)] = {'count': int(count),'selected': sku_id in cart_selected}else:# 用户未登录,查询cookies购物车pass

2.查询cookie购物车

class CartsView(View):"""购物车管理"""def get(self, request):"""展示购物车"""user = request.userif user.is_authenticated:# 用户已登录,查询redis购物车......else:# 用户未登录,查询cookies购物车cart_str = request.COOKIES.get('carts')if cart_str:# 将cart_str转成bytes,再将bytes转成base64的bytes,最后将bytes转字典cart_dict = pickle.loads(base64.b64decode(cart_str.encode()))else:cart_dict = {}

3.查询购物车SKU信息

class CartsView(View):"""购物车管理"""def get(self, request):"""展示购物车"""user = request.userif user.is_authenticated:# 用户已登录,查询redis购物车......else:# 用户未登录,查询cookies购物车......# 构造购物车渲染数据sku_ids = cart_dict.keys()skus = models.SKU.objects.filter(id__in=sku_ids)cart_skus = []for sku in skus:cart_skus.append({'id':sku.id,'name':sku.name,'count': cart_dict.get(sku.id).get('count'),'selected': str(cart_dict.get(sku.id).get('selected')),  # 将True,转'True',方便json解析'default_image_url':sku.default_image.url,'price':str(sku.price), # 从Decimal('10.2')中取出'10.2',方便json解析'amount':str(sku.price * cart_dict.get(sku.id).get('count')),})context = {'cart_skus':cart_skus,}# 渲染购物车页面return render(request, 'cart.html', context)

4.渲染购物车信息

cart.html

<div class="total_count">全部商品<em>[[ total_count ]]</em>件</div>
<ul class="cart_list_th clearfix"><li class="col01">商品名称</li><li class="col03">商品价格</li><li class="col04">数量</li><li class="col05">小计</li><li class="col06">操作</li>
</ul>
<ul class="cart_list_td clearfix" v-for="(cart_sku,index) in carts" v-cloak><li class="col01"><input type="checkbox" name="" v-model="cart_sku.selected" @change="update_selected(index)"></li><li class="col02"><img :src="cart_sku.default_image_url"></li><li class="col03">[[ cart_sku.name ]]</li><li class="col05">[[ cart_sku.price ]]元</li><li class="col06"><div class="num_add"><a @click="on_minus(index)" class="minus fl">-</a><input v-model="cart_sku.count" @blur="on_input(index)" type="text" class="num_show fl"><a @click="on_add(index)" class="add fl">+</a></div></li><li class="col07">[[ cart_sku.amount ]]元</li><li class="col08"><a @click="on_delete(index)">删除</a></li>
</ul>
<ul class="settlements" v-cloak><li class="col01"><input type="checkbox" name="" @change="on_selected_all" v-model="selected_all"></li><li class="col02">全选</li><li class="col03">合计(不含运费):<span>¥</span><em>[[ total_selected_amount ]]</em><br>共计<b>[[ total_selected_count ]]</b>件商品</li><li class="col04"><a href="place_order.html">去结算</a></li>
</ul>

美多商城之购物车(购物车管理1)相关推荐

  1. 注册登录鉴权以及购物车常见管理

    这里写自定义目录标题 注册鉴权以及购物车系统相关知识点 对称加密和非对称加密: **jwt**包含三部分: **登录**分为**授权和鉴权** 注册鉴权以及购物车系统相关知识点 ** 对称加密和非对称 ...

  2. 商城-购物车-购物车功能分析

    商城-购物车-购物车功能分析 2.购物车功能分析 2.1.需求 2.2.流程图 2.购物车功能分析 2.1.需求 需求描述: 用户可以在登录状态下将商品添加到购物车 放入数据库 放入redis(采用) ...

  3. 欢迎来到美多商城!-项目准备之项目介绍-项目需求分析-项目架构设计

    欢迎来到美多商城! [前后端不分离的项目] 项目介绍 项目需求分析 需求分析原因: 可以整体的了解项目的业务流程和主要的业务需求. 项目中,需求驱动开发.即开发人员需要以需求为目标来实现业务逻辑. 需 ...

  4. 【美多商城项目01】了解主要需求和架构设计,创建配置工程

    一.美多商城项目介绍 1.1 项目需求分析 需求分析原因 项目中,需求驱动开发,即开发人员需要以需求为目标来实现业务逻辑. 需求分析方式 企业中,借助产品原型图分析需求. 需求分析完后,前端按照产品原 ...

  5. Django3+Vue美多商城项目的总结

    文章目录 项目说明 主要环境搭建 主要技术实现 django 的配置文件 celery的使用(异步发送短信验证码和邮箱验证链接) 容联云通讯短信平台 QQ登录 jwt实现加密解密验证实现数据的安全性 ...

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

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

  7. Python项目实战之欢迎来到美多商城!学习目录导航

    1. 项目准备 1.1. 项目介绍 1.1.1. 项目需求分析 1.1.2. 项目架构设计 1.2. 工程创建和配置 1.2.1. 创建工程 1.2.2. 配置开发环境 1.2.3. 配置Jinja2 ...

  8. 零基础也能快速上手的python实战项目----美多商城

    美多商城:课时安排16天 黑马程序员python企业级开发项目-手把手从0到1开发<美多商城>_哔哩哔哩_bilibili 美多商城属于B2C电商平台,商城销售自营商品给顾客.系统前台包括 ...

  9. java基于ssm开发的美妆商城化妆品电商系统有论文

    简介 Java基于ssm(可以转springboot项目哦)开发的美妆商城系统,主要是卖化妆品的系统,用户可以浏览商品,加入购物车,下单,在个人中心管理自己的订单.管理员可以管理自己的商品,发布商品, ...

  10. python美多商城项目百度网盘_美多商城项目(七)

    正文共: 7620字 4图 预计阅读时间: 20分钟 每日分享 If you can change your mind, you can change your life. 如果你愿意改变你的想法,你 ...

最新文章

  1. OpenFlow Switch —— 软件架构
  2. 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
  3. gson json转map_Java几种常用JSON库性能比较
  4. 荷兰商业银行使用精益领导力推行改进
  5. vbox 中ubuntu20.04和宿主机共享文件_如何在家搭建一套自己的实验平台(10)iSCSI 共享存储...
  6. restful api接口规范_Restful API设计规范
  7. Python Challenge 过关心得(0)
  8. deepinu盘制作工具_用U盘装系统,试试这款多系统启动盘制作工具!
  9. 玉石直播招商团队薪酬绩效方案
  10. 风险模型—VaR模型1
  11. PADS VX2.8 原理图图页的添加与名称修改的方法
  12. 最新!!! iOS app添加微信授权登录——Qt for IOS
  13. shell if语句和test命令
  14. linux中mv、cp、rm分别是什么意思
  15. STM32实战(1):搭建模板工程
  16. windows找不到gpedit.msc请确定文件名
  17. 在ubuntu下烧写映像文件到SD卡--基于三星210开发板
  18. day10-阶段测评
  19. 架设个人FTP——ServU
  20. 华硕服务器主板型号命名规则,装机指南 华硕主板新命名规则解读

热门文章

  1. 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
  2. 程序员晒元宵节福利,网友:看了我想砸键盘......
  3. 今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用
  4. 25年了,我总结出这些信息提取的经验教训
  5. 那些打着AI万金油旗号的产品欺骗大众,如何识别?
  6. 大数据工程师手册:全面系统的掌握必备知识与工具
  7. 做人工智能必看的45篇论文 | 附下载地址
  8. 面对互联网一线大厂,这些技术你需要了解!
  9. 专访施巍松:边缘计算早期提出者之一
  10. MySQL 用 limit 为什么会影响性能?