美多商城之购物车(购物车管理1)
二、购物车管理
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)相关推荐
- 注册登录鉴权以及购物车常见管理
这里写自定义目录标题 注册鉴权以及购物车系统相关知识点 对称加密和非对称加密: **jwt**包含三部分: **登录**分为**授权和鉴权** 注册鉴权以及购物车系统相关知识点 ** 对称加密和非对称 ...
- 商城-购物车-购物车功能分析
商城-购物车-购物车功能分析 2.购物车功能分析 2.1.需求 2.2.流程图 2.购物车功能分析 2.1.需求 需求描述: 用户可以在登录状态下将商品添加到购物车 放入数据库 放入redis(采用) ...
- 欢迎来到美多商城!-项目准备之项目介绍-项目需求分析-项目架构设计
欢迎来到美多商城! [前后端不分离的项目] 项目介绍 项目需求分析 需求分析原因: 可以整体的了解项目的业务流程和主要的业务需求. 项目中,需求驱动开发.即开发人员需要以需求为目标来实现业务逻辑. 需 ...
- 【美多商城项目01】了解主要需求和架构设计,创建配置工程
一.美多商城项目介绍 1.1 项目需求分析 需求分析原因 项目中,需求驱动开发,即开发人员需要以需求为目标来实现业务逻辑. 需求分析方式 企业中,借助产品原型图分析需求. 需求分析完后,前端按照产品原 ...
- Django3+Vue美多商城项目的总结
文章目录 项目说明 主要环境搭建 主要技术实现 django 的配置文件 celery的使用(异步发送短信验证码和邮箱验证链接) 容联云通讯短信平台 QQ登录 jwt实现加密解密验证实现数据的安全性 ...
- Django框架之美多商城项目
后续技术类文档更新到微信公众号-------->>喜欢的扫码关注 美多商城 1. 项目的准备 - 分析商业模式:B2C- 开发流程- 项目的架构- 创建工程- 配置 2. 登录模块 2.1 ...
- Python项目实战之欢迎来到美多商城!学习目录导航
1. 项目准备 1.1. 项目介绍 1.1.1. 项目需求分析 1.1.2. 项目架构设计 1.2. 工程创建和配置 1.2.1. 创建工程 1.2.2. 配置开发环境 1.2.3. 配置Jinja2 ...
- 零基础也能快速上手的python实战项目----美多商城
美多商城:课时安排16天 黑马程序员python企业级开发项目-手把手从0到1开发<美多商城>_哔哩哔哩_bilibili 美多商城属于B2C电商平台,商城销售自营商品给顾客.系统前台包括 ...
- java基于ssm开发的美妆商城化妆品电商系统有论文
简介 Java基于ssm(可以转springboot项目哦)开发的美妆商城系统,主要是卖化妆品的系统,用户可以浏览商品,加入购物车,下单,在个人中心管理自己的订单.管理员可以管理自己的商品,发布商品, ...
- python美多商城项目百度网盘_美多商城项目(七)
正文共: 7620字 4图 预计阅读时间: 20分钟 每日分享 If you can change your mind, you can change your life. 如果你愿意改变你的想法,你 ...
最新文章
- OpenFlow Switch —— 软件架构
- 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
- gson json转map_Java几种常用JSON库性能比较
- 荷兰商业银行使用精益领导力推行改进
- vbox 中ubuntu20.04和宿主机共享文件_如何在家搭建一套自己的实验平台(10)iSCSI 共享存储...
- restful api接口规范_Restful API设计规范
- Python Challenge 过关心得(0)
- deepinu盘制作工具_用U盘装系统,试试这款多系统启动盘制作工具!
- 玉石直播招商团队薪酬绩效方案
- 风险模型—VaR模型1
- PADS VX2.8 原理图图页的添加与名称修改的方法
- 最新!!! iOS app添加微信授权登录——Qt for IOS
- shell if语句和test命令
- linux中mv、cp、rm分别是什么意思
- STM32实战(1):搭建模板工程
- windows找不到gpedit.msc请确定文件名
- 在ubuntu下烧写映像文件到SD卡--基于三星210开发板
- day10-阶段测评
- 架设个人FTP——ServU
- 华硕服务器主板型号命名规则,装机指南 华硕主板新命名规则解读
热门文章
- 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
- 程序员晒元宵节福利,网友:看了我想砸键盘......
- 今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用
- 25年了,我总结出这些信息提取的经验教训
- 那些打着AI万金油旗号的产品欺骗大众,如何识别?
- 大数据工程师手册:全面系统的掌握必备知识与工具
- 做人工智能必看的45篇论文 | 附下载地址
- 面对互联网一线大厂,这些技术你需要了解!
- 专访施巍松:边缘计算早期提出者之一
- MySQL 用 limit 为什么会影响性能?