Python全系列 教程
3567个小节阅读:5929.4k
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
加入购物车分为用户登录和未登录两种。
配置路由
根路由
xxxxxxxxxx
path('cartapp/',include(('cartapp.urls','cartapp'))) ,#默认加入购物车
子路由
xxxxxxxxxx
from django.urls import path,include
from cartapp import views
urlpatterns = [
path('',views.CartItemView.as_view(),name='cartItem'),
path('queryAll/',views.queryAll,name='queryAll'),
]
修改商品的详情页
xxxxxxxxxx
<form action="/cartapp/" method="post">
<input name="colorid" type="hidden">
<input name="goodsid" type="hidden" value="{{goods.id}}">
<input name="sizeid" type="hidden">
<input name="count" type="hidden">
<input name="flag" value="add" type="hidden">
{% csrf_token%}
<button class="male" onclick="goCart()">加入购物车</button>
</form>
视图views.py
xxxxxxxxxx
from django.shortcuts import redirect, render
from django.views import View
from cartapp.cartmanager import *
# Create your views here.
#购物车视图类
class CartItemView(View):
def get(self,request):
pass
def post(self,request):
#获取用户当前操作类型
flag = request.POST.get('flag','')
if flag == 'add':
cartManagerObj = getCartManger(request)
cartManagerObj.add(**request.POST.dict())
return redirect('cartapp:queryAll')
#查询所有购物车列表
def queryAll(request):
#获取工具类getCartManger对象
cartManagerObj = getCartManger(request)
cartItemList = cartManagerObj.queryAll(request)
return render(request,'cartapp/cart.html',{'cartItemList':cartItemList})
工具类cartmanager.py
xxxxxxxxxx
#coding=utf-8
from collections import OrderedDict
from userapp.models import *
from cartapp.models import *
from django.db.models import F
import jsonpickle
class CartManager(object):
def add(self,goodsid,colorid,sizeid,count,*args,**kwargs):
'''添加商品,如果商品已经存在就更新商品的数量(self.update()),否则直接放到购物车'''
pass
def delete(self,goodsid,colorid,sizeid,*args,**kwargs):
'''删除一个购物项'''
pass
def update(self,goodsid,colorid,sizeid,count,step,*args,**kwargs):
'''更新购物项的数据,添加减少购物项数据'''
pass
def queryAll(self,*args,**kwargs):
''':return CartItem 多个购物项'''
pass
#当前用户未登录
class SessionCartManager(CartManager):
cart_name = 'cart'
def __init__(self,session):
self.session = session
# 创建购物车 # {cart:{key1:cartitem,key2:cartitem}}
if self.cart_name not in self.session:
self.session[self.cart_name] = OrderedDict()
def __get_key(self,goodsid,colorid,sizeid):
return goodsid+','+colorid+','+sizeid
def add(self,goodsid,colorid,sizeid,count,*args,**kwargs):
#获取购物项的唯一标示
key = self.__get_key(goodsid,colorid,sizeid)
# session {'cart':{key1:item}}
# session('cart',[{key1:cartitem,key2:cartitem}])
if key in self.session[self.cart_name]:
self.update(goodsid,colorid,sizeid,count,*args,**kwargs)
else:
self.session[self.cart_name][key] = CartItem(goodsid=goodsid,colorid=colorid,sizeid=sizeid,count=count)
def delete(self,goodsid,colorid,sizeid,*args,**kwargs):
key = self.__get_key(goodsid,colorid,sizeid)
if key in self.session[self.cart_name]:
del self.session[self.cart_name][key]
def update(self,goodsid,colorid,sizeid,step,*args,**kwargs):
key = self.__get_key(goodsid,colorid,sizeid)
if key in self.session[self.cart_name]:
cartitem = self.session[self.cart_name][key]
cartitem.count = int(str(cartitem.count))+int(step)
else:
raise Exception('SessionManager中的update出错了')
def queryAll(self,*args,**kwargs):
return self.session[self.cart_name].values()
def migrateSession2DB(self):
if 'user' in self.session:
user = self.session.get('user')
for cartitem in self.queryAll():
if CartItem.objects.filter(goodsid=cartitem.goodsid,colorid=cartitem.colorid,sizeid=cartitem.sizeid).count()==0:
cartitem.user = user
cartitem.save()
else:
item = CartItem.objects.get(goodsid=cartitem.goodsid,colorid=cartitem.colorid,sizeid=cartitem.sizeid)
item.count = int(item.count)+int(cartitem.count)
item.save()
del self.session[self.cart_name]
#用户已登录
class DBCartManger(CartManager):
def __init__(self,user):
self.user = user
def add(self,goodsid,colorid,sizeid,count,*args,**kwargs):
if self.user.cartitem_set.filter(goodsid=goodsid,colorid=colorid,sizeid=sizeid).count()==1:
self.update(goodsid,colorid,sizeid,count,*args,**kwargs)
else:
CartItem.objects.create(goodsid=goodsid,colorid=colorid,sizeid=sizeid,count=count,user=self.user)
def delete(self,goodsid,colorid,sizeid,*args,**kwargs):
self.user.cartitem_set.filter(goodsid=goodsid,colorid=colorid,sizeid=sizeid).update(count=0,isdelete=True)
def update(self,goodsid,colorid,sizeid,step,*args,**kwargs):
self.user.cartitem_set.filter(goodsid=goodsid,colorid=colorid,sizeid=sizeid).update(count=F('count')+int(step),isdelete=False)
def queryAll(self,*args,**kwargs):
return self.user.cartitem_set.order_by('id').filter(isdelete=False).all()
#获取当前用户下的所有购物项
def get_cartitems(self,goodsid,sizeid,colorid,*args,**kwargs):
return self.user.cartitem_set.get(goodsid=goodsid,sizeid=sizeid,colorid=colorid)
# 工厂方法
#根据当前用户是否登录返回相应的CartManger对象
def getCartManger(request):
if request.session.get('user'):
#当前用户已登录
return DBCartManger(jsonpickle.loads(request.session.get('user')))
return SessionCartManager(request.session)
cart.html
xxxxxxxxxx
{% extends 'base.html' %}
{% block title %}购物车页面{% endblock %}
{% block main %}
<section class="cartMain">
<div class="cartMain_hd">
<ul class="order_lists cartTop">
<li class="list_chk">
<!--所有商品全选-->
<input type="checkbox" id="all" class="whole_check" style="display: inline-block;position:relative;left: -8px;top: 4px">
全选
</li>
<li class="list_con">商品信息</li>
<li class="list_info">商品参数</li>
<li class="list_price">单价</li>
<li class="list_amount">数量</li>
<li class="list_sum">金额</li>
<li class="list_op">操作</li>
</ul>
</div>
<div class="cartBox">
<div class="order_content">
{% for cartItem in cartItemList %}
<ul style="position: relative" class="order_lists" goodsid="{{ cartItem.goodsid }}" sizeid="{{ cartItem.sizeid }}" colorid="{{ cartItem.colorid }}">
<li class="list_chk">
<input type="checkbox" id="checkbox_2" class="son_check" style="display: inline-block;position:absolute;left: 21px;top: 54px">
</li>
<li class="list_con">
<div class="list_img"><a href="javascript:;"><img src="{{ cartItem.getColor.colorurl }}" alt=""></a></div>
<div class="list_text"><a href="javascript:;">{{ cartItem.getGoods.gname }}</a></div>
</li>
<li class="list_info">
<p>颜色:{{ cartItem.getColor.colorname }}</p>
<p>尺寸:{{ cartItem.getSize.sname }}</p>
</li>
<li class="list_price">
<p class="price">¥{{ cartItem.getGoods.price }}</p>
</li>
<li class="list_amount">
<div class="amount_box">
<a href="javascript:;" class="reduce reSty" goodsid="{{ cartItem.goodsid }}" sizeid="{{ cartItem.sizeid }}" colorid="{{ cartItem.colorid }}">-</a>
<input type="text" value="{{ cartItem.count }}" class="sum" readonly="">
<a href="javascript:;" class="plus" goodsid="{{ cartItem.goodsid }}" sizeid="{{ cartItem.sizeid }}" colorid="{{ cartItem.colorid }}">+</a>
</div>
</li>
<li class="list_sum">
<p class="sum_price">¥{{ cartItem.getTotalPrice }}</p>
</li>
<li class="list_op">
<p class="del"><a href="javascript:;" class="delBtn" goodsid="{{ cartItem.goodsid }}" sizeid="{{ cartItem.sizeid }}" colorid="{{ cartItem.colorid }}">移除商品</a></p>
</li>
</ul>
{% endfor %}
</div>
</div>
<!--底部-->
<div class="bar-wrapper">
<div class="bar-right">
<div class="piece">已选商品<strong class="piece_num" id="all_count">0</strong>件</div>
<div class="totalMoney">共计: <strong class="total_text" id="all_price">0.00</strong></div>
<div class="calBtn"><a href="javascript:;" id="jiesuan">结算</a></div>
</div>
</div>
</section>
<section class="model_bg" style="display: none;"></section>
<section class="my_model" style="display: none;">
<p class="title">删除宝贝<span class="closeModel">X</span></p>
<p>您确认要删除该宝贝吗?</p>
<div class="opBtn"><a href="javascript:;" class="dialog-sure">确定</a><a href="javascript:;" class="dialog-close">关闭</a>
</div>
</section>
<input type="hidden" name="csrfmiddlewaretoken" value="JyaqZY2G1WlHajMF9aSD7GTIUKqBai918GdZmW8skri98iVfK7FipbnrGijHCf0A">
{% endblock %}
{% block footerjs %}
<script>
$('.plus').click(function(event){
<!--将数据同步到服务器-->
var csrfmiddlewaretoken = $('input[name="csrfmiddlewaretoken"]').val()
var goodsid = $(this).attr('goodsid')
var colorid = $(this).attr('colorid')
var sizeid = $(this).attr('sizeid')
var data={
goodsid:goodsid,
colorid:colorid,
sizeid:sizeid,
csrfmiddlewaretoken:csrfmiddlewaretoken,
type:'plus'
}
$.ajax({
async:false,
url:'/cart/',
data:data,
type:'post',
success:function(data) {
},
error:function(){
<!--按钮设置了两个点击事件-->
event.stopImmediatePropagation()
}
})
})
$('.reduce').click(function(event){
<!--将数据同步到服务器-->
if ($(this).next('input').val()<=1){
event.stopImmediatePropagation()
return;
}
var csrfmiddlewaretoken = $('input[name="csrfmiddlewaretoken"]').val()
var goodsid = $(this).attr('goodsid')
var colorid = $(this).attr('colorid')
var sizeid = $(this).attr('sizeid')
var data={
goodsid:goodsid,
colorid:colorid,
sizeid:sizeid,
csrfmiddlewaretoken:csrfmiddlewaretoken,
type:'minus'
}
$.ajax({
async:false,
url:'/cart/',
type:'post',
data:data,
success:function(data) {
},
error:function(){
<!--按钮设置了两个点击事件-->
event.stopImmediatePropagation()
}
})
})
$('.delBtn').click(function(){
var goodsid= $(this).attr('goodsid');
var colorid= $(this).attr('colorid');
var sizeid= $(this).attr('sizeid');
$('.dialog-sure').attr('goodsid',goodsid).attr('colorid',colorid).attr('sizeid',sizeid)
})
$('.dialog-sure').click(function(event){
var goodsid= $(this).attr('goodsid');
var colorid= $(this).attr('colorid');
var sizeid= $(this).attr('sizeid');
var csrfmiddlewaretoken = $('input[name="csrfmiddlewaretoken"]').val();
var data={
goodsid:goodsid,
colorid:colorid,
sizeid:sizeid,
csrfmiddlewaretoken:csrfmiddlewaretoken,
type:'delete'
}
$.ajax({
type:'post',
url:'/cart/',
data:data,
async:false,
success:function(result) {
},
error:function(event){
//停止事件传播
event.stopImmediatePropagation()
}
})
})
//在购物车页面点击登录按钮后回转到购物车页面
$('.sign > a').click(function(event){
var link = $(this).attr('href')
$(this).attr('href',link+"?redirct=cart")
})
//单击结算按钮
$('#jiesuan').click(function(){
cks = $('.son_check')
var cartitem = []
$.each(cks,function(index,ck){
if($(ck).prop('checked')){
var goodsid = $(ck).parents('.order_lists').attr('goodsid')
var sizeid = $(ck).parents('.order_lists').attr('sizeid')
var colorid = $(ck).parents('.order_lists').attr('colorid')
cartitem.push(JSON.stringify({'goodsid':goodsid,'sizeid':sizeid,'colorid':colorid}))
}
})
if(cartitem.length==0){
return;
}
var url = '/order/?cartitems='+cartitem;
$(this).attr('href',url);
})
</script>
{% endblock %}