完整电商项目--(七)购物车模块(1)

asp.net 实现购物车     shoppingcart        http://schemas.microsoft.com/intellisense/ie5">                                      ShowFooter="false" CellPadding="3" CellSpacing="0" Font-Name="Verdana" Font-Size="8pt" Head 阅读详情

购物车存储方案

  • 分两种情况

用户登录

  • 描述一条完整的购物车记录需要
    • 用户、商品、数量、勾选状态
    • 存储数据:user_id、sku_id、count、selected
    • 存储位置:
      • 选择redis数据库
      • 数据存储类型
        • (1)选择hash类型,保存用户,商品,数量等信息。
          在这里插入图片描述
          存储的数据应为:carts_user_id: {sku_id1: count, sku_id3: count, sku_id5: count, …}

        • (2)勾选状态:采用set类型存储

        • 只将已勾选商品的sku_id存储到set中,比如,1号和3号商品是被勾选的

        • 形式:selected_user_id: [sku_id1, sku_id3, …]

1111111111111111111111111111111111

  • 存储逻辑说明
    • 当要添加到购物车的商品已存在时,对商品数量进行累加计算
    • 当要添加到购物车的商品不存在时,向hash中新增field和value即可

用户未登录

存储数据

  • 和上面是一样的user_id、sku_id、count、selected

存储位置

  • 由于用户未登录,服务端无法拿到用户的ID
  • 我们可以将未登录用户的购物车数据缓存到用户浏览器的cookie中,每个用户自己浏览器的cookie中存储属于自己的购物车数据

存储类型

  • (1)浏览器的cookie中存储的数据类型是字符串
  • (2)JSON字符串可以描述复杂结构的字符串数据,可以保证一条购物车记录不用分开存储
  • 数据结构展示:
{
    "sku_id1":{
        "count":"1",
        "selected":"True"
    },
    "sku_id3":{
        "count":"3",
        "selected":"True"
    },
    "sku_id5":{
        "count":"3",
        "selected":"False"
    }
}

存储逻辑说明

  • 当要添加到购物车的商品已存在时,对商品数量进行累加计算。
  • 当要添加到购物车的商品不存在时,向JSON中新增field和value即可

数据安全处理:

  • (1)浏览器cookie中存储的是字符串明文数据
    • 我们需要对数据进行加密
  • (2) 解决方案:pickle模块 和 base64模块

pickle模块介绍

  • pickle模块是Python的标准模块,提供了对Python数据的序列化操作,可以将数据转换为bytes类型,且序列化速度快。
  • 使用方法:
    • pickle.dumps()将Python数据序列化为bytes类型数据
    • pickle.loads()将bytes类型数据反序列化为python数据。

base64模块介绍

  • 注意!!! : pickle模块序列化转换后的数据是bytes类型,浏览器cookie无法存储
  • 介绍:
    • base64模块是Python的标准模块,可以对bytes类型数据进行编码,并得到bytes类型的密文数据
    • 使用:
      • base64.b64encode()将bytes类型数据进行base64编码,返回编码后的bytes类型数据
      • base64.b64deocde()将base64编码后的bytes类型数据进行解码,返回解码后的bytes类型数据。

下面是具体的代码实现

增加购物车

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()

cookie中

# 用户未登录,操作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_count
            cart_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': '添加购物车成功'})
            # 响应结果并将购物车数据写入到cookie
            response.set_cookie('carts', cookie_cart_str, max_age=constants.CARTS_COOKIE_EXPIRES)

删除购物车

redis中

 redis_conn = get_redis_connection('carts')
            pl = redis_conn.pipeline()
            # 删除键,就等价于删除了整条记录
            pl.hdel('carts_%s' % user.id, sku_id)
            pl.srem('selected_%s' % user.id, sku_id)
            pl.execute()

删除cookie购物车

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 = {}

            # 创建响应对象
            response = http.JsonResponse({'code': RETCODE.OK, 'errmsg': '删除购物车成功'})
            if sku_id in cart_dict:
                del cart_dict[sku_id]
                # 将字典转成bytes,再将bytes转成base64的bytes,最后将bytes转字符串
                cookie_cart_str = base64.b64encode(pickle.dumps(cart_dict)).decode()
                # 响应结果并将购物车数据写入到cookie
                response.set_cookie('carts', cookie_cart_str, max_age=constants.CARTS_COOKIE_EXPIRES)
            return response

其余的修改,展示购物车都是类似的,这里就不说了

全选购物车

redis中:

# 用户已登录,操作redis购物车
            redis_conn = get_redis_connection('carts')
            cart = redis_conn.hgetall('carts_%s' % user.id)
            sku_id_list = cart.keys()
            if selected:
                # 全选
                redis_conn.sadd('selected_%s' % user.id, *sku_id_list)
            else:
                # 取消全选
                redis_conn.srem('selected_%s' % user.id, *sku_id_list)
            return http.JsonResponse({'code': RETCODE.OK, 'errmsg': '全选购物车成功'})

cookie中

# 用户已登录,操作cookie购物车
            cart = request.COOKIES.get('carts')
            response = http.JsonResponse({'code': RETCODE.OK, 'errmsg': '全选购物车成功'})
            if cart is not None:
                cart = pickle.loads(base64.b64decode(cart.encode()))
                for sku_id in cart:
                    cart[sku_id]['selected'] = selected
                cookie_cart = base64.b64encode(pickle.dumps(cart)).decode()
                response.set_cookie('carts', cookie_cart, max_age=constants.CARTS_COOKIE_EXPIRES)

合并购物车

# 获取cookie中的购物车数据
    cookie_cart_str = request.COOKIES.get('carts')
    # cookie中没有数据就响应结果
    if not cookie_cart_str:
        return response
    cookie_cart_dict = pickle.loads(base64.b64decode(cookie_cart_str.encode()))

    new_cart_dict = {}
    new_cart_selected_add = []
    new_cart_selected_remove = []
    # 同步cookie中购物车数据
    for sku_id, cookie_dict in cookie_cart_dict.items():
        new_cart_dict[sku_id] = cookie_dict['count']

        if cookie_dict['selected']:
            new_cart_selected_add.append(sku_id)
        else:
            new_cart_selected_remove.append(sku_id)

    # 将new_cart_dict写入到Redis数据库
    redis_conn = get_redis_connection('carts')
    pl = redis_conn.pipeline()
    pl.hmset('carts_%s' % user.id, new_cart_dict)
    # 将勾选状态同步到Redis数据库
    if new_cart_selected_add:
        pl.sadd('selected_%s' % user.id, *new_cart_selected_add)
    if new_cart_selected_remove:
        pl.srem('selected_%s' % user.id, *new_cart_selected_remove)
    pl.execute()

    # 清除cookie
    response.delete_cookie('carts')

就到这里吧,全是增删改查,操作cookie和redis,其实很繁琐,但是不是很难,大家仔细看懂逻辑实现就可以。

电商项目购物车及订单系统实现 概述 购物车和订单是电商项目的核心,本文将简单介绍一下两者的实现。 一、购物车功能实现 1.功能说明 1、商品加入购物车时,不是必须要求登录。 2、计算购物车中商品的总价。当商品数量发生变化时需要重新计算。 3、用户可以删除购物车中的商品。 4、用户下单后,删除购物车的功能。 2.功能分析 1、在用户不登陆的清空下也可以使用购物车,那么就需要把购物车信息放入cookie中。 2、可以把商品信息,存放到pojo中,然后序列化成json存入cookie中。 3、取商品信息可以从cookie中把json数据取出 阅读详情

相关推荐

电商项目之购物车设计

购物车 购物车数据的储存 购物车设计是每个电商项目中必不可缺的一环,不管登录与否,购物车都可以使用.那么购物车的数据我们存在哪里呢? 登录时,购物车的数据理所应当的存在redis数据库中,可是未登录时呢? 在这里我们给出了三个方案 1、当用户在未登录的情况下,将此购物车存入Cookie中, 在用户登陆的情况下,将购物车数据存入redis 。如果用户登陆时,Cookie中存在购物车数...

woshisunxinyuan的博客 7892

Web商城购物车模块实现

转载于:https://blog.51cto.com/1137907860/1676605

weixin_34294649的博客 456

电商系统购物车模块设计

在电商系统中,购物车是核心模块之一,用户在浏览商品过程中,可将心仪商品添加到购物车,待浏览完毕后统一结算购买。所以一份合理高效的购物车设计,对于提升用户体验、促进销售转化、降低运营成本等方面都有着至关重要的作用。

14年产品经理老兵,想把自己的经验及总结分享给大家,只讲思路及实操,不讲废话 1469

购物车模块设计

把购买商品存起来 redis 把购买商品查询出来,显示到购物车页面 未登录情况下 使用的是sessionId 已经登陆的情况下 使用的是登录名 public class Cart implements Serializable { //商家的id 唯一的值 private String sellerId; //商家的名称 private String sellerName; //...

qq_36478567的博客 2139

SpringBoot电商项目之实现购物车功能

*** @author 杨总*//*** 使用参数解析器之前的做法 弊端:* 在每一个需要登录之后才能操作的功能,都需要做用户登录验证,即以下代码都需要再写一遍* @return*/}}弊端:在每一个需要登录之后才能操作的功能,都需要做用户登录验证,即以下代码都需要再写一遍运行时,点击加入购物车会出现关于Mybatis-plus时间字段代码生成问题。

weixin_65808248的博客 3766

高薪程序员&面试题精讲系列151之电商专题(中)-你做过电商项目吗?说说购物车的实现流程吧

我们写在简历上的任何一个项目,都有可能会被面试官问到,常见的面试题目离不开这么几个,“说说你最近做的或者最熟悉的一个项目吧,这个项目有哪些功能模块?你在这个项目中负责了哪些功能?........”对于类似这样的问题,其实一般情况下我们根据自己的项目实际情况,如实介绍就行了。但实际很多人,对自己简历上的项目并不一定很了解。有些人是对找工作根本就不用心,跳槽之前根本就不刷题背知识点,也不梳理项目;

一一哥 1371

.net c#购物车模块分析

http://blog.youkuaiyun.com/IHandler/article/details/5781662 购物车的实现形式多样,在这里,我用到了虚拟表和sesson方法存储。 首先创建一个商品的表,GridView控件绑定数据源。在GridView中添加一个列,控件为 buttonfield.在GridView的RowCommand事件写代码: Da...

weixin_30666943的博客 234

【电商项目实战】购物车完善

将原有的购物车页面部分功能完善,功能有全选、全部不选、计算小计和总价、计算商品数量、删除和批量删除等

万维网连五洲,二进制写尽天下事,喜欢结识新伙伴寻找志同道合的朋友,欢迎一起探讨学习 3474

功能测试(四)—— web项目购物车模块测试与网络知识

URL( 网址) =协议://主机地址(IP地址或域名):端口号/路径?POST请求参数放在请求体里( 抓包才能看到) ——相对安全。响应状态码是用数字表示的响应状态, 最常见的有4种类型。表示数据路径发生改变, 需要重定向。GET请求参数放在URL里( 在浏览器地址栏中可以直接看到)服务器返回给客户端的数据内容。HTTP请求中有两个最常见的请求方法: GET和POST。如200、202、 204等。如: 404、 403等。如: 500、 503等。HTML、 Json、 TXT、 图片。

此心光明事上练的博客 1205

电商项目购物车模块详细设计

一个电商项目完整购物车模块详细设计文档以及流程,适合正在做项目的攻城狮们使用

电子商务网站购物车模块Visor流程图

用Viso实现电子商务网站购物车模块的整个流程,图形化显示,非常简单易懂

Spring Boot电商项目43:购物车模块一:购物车模块介绍;(模块介绍;效果演示;6个接口介绍;业务流程;)

说明: (1)本篇博客的目的:了解【购物车模块】的开发内容;熟悉【购物车分类模块】的6个接口; (2)声明:【购物车模块】只在前台中有应用; 声明:对于电商项目来说,【购物车模块】并不是必须的;比如拼多多就没有购物车模块;但大多数电商项目,其都还是有【购物车模块】的; 一:【购物车模块】模块介绍、功能演示; 1.【购物车模块】模块介绍; 说明: (1)加入商品:把商品加入到购物车; (2)列表显示:显示购物车列表; (3)数量更改:比如同一个商品,我们想买两个,那么就可以.

小枯林的博客 1万+

基于Active-HDL的HDL设计录入与仿真

作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 优快云: https://me.youkuaiyun.com/qq_4053...

一个会写代码的烤鸭 7780

Java电商项目面试--购物车模块

购物车模块技术要点: 1、商品总价计算复用封装 2、高复用的逻辑方法封装思想 3、解决商业运算丢失精度的坑 一、购物车模块功能 1、购物车添加商品 2、更新商品数量 3、查询商品数量 4、移除购物车中商品 5、单选/全选 二、购物车添加商品 Controller层: //购物车添加商品 @RequestMapping("add.do") @Respons...

小刺猬 2万+

Python-Opencv中的膨胀和腐蚀

Python-Opencv中的膨胀和腐蚀 腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。 膨胀就是图像中的高亮部分进行膨胀,“邻域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中高亮部分被腐蚀,“邻域被蚕食”,效果图拥有比原图更小的高亮区域。 1.膨胀 膨胀过程是有一个结构元素或者模板去在原图像素比对,当比对过程中,中心像素位置的值根据其八邻域取或运算,或运算为1就取自己的中心值,...

qq_44262417的博客 1万+

FFmpeg实战:5分钟搞定m3u8视频下载与ts文件合并(附完整命令)

本文详细介绍了如何使用FFmpeg快速下载m3u8视频并合并ts文件为mp4格式。通过简洁的命令行操作,读者可以轻松完成视频处理任务,包括环境准备、链接获取、下载合并及性能优化等实用技巧,特别适合需要高效处理流媒体内容的用户。

weixin_30836759的博客 221

关于电商项目的购物车总结和购物车实现

关于电商项目的购物车总结和购物车实现 本文中简述的购物车模仿京东的模式,用户没有登录,也可进行购物车的操作,如果用户登录了,则在数据库中操作购物车。我们基于存放在cookies里面。 先看添加到购物车的按钮 看这个界面是因为,如果放代码,因为代码中很多的数据是与其他相互关联的,所以只要理解了购物车的模式和方法,实现起来就没有那么复杂了,这里放一下,加入购物车需要哪些参数 <form...

chen_long的博客 1万+

T型三电平关管顺序要求

摘要: T型三电平拓扑中,IGBT关断必须遵循“外管先关、内管后关”的时序,否则易导致器件损坏。正常导通时,外管与内管共同分担电压;正确关断时,外管先关使电流经内管续流至中点,避免电压过冲;若内管先关,电流路径被强制切断,杂散电感引发高压尖峰击穿器件。这一时序本质是为电流提供低应力续流路径,需通过硬件或软件严格保障。

yun0804的博客 2369

SpingBoot的项目实战--模拟电商【3.购物车模块】

购物车的相关内容

m0_74315688的博客 2297

基于STM32与FPGA的数据采集系统的设计与实现

数据采集系统在现代工程中起着至关重要的作用,用于实时获取和处理各种传感器或外部设备的数据。在本文中,我们将探讨如何基于STM32微控制器和FPGA(现场可编程门阵列)实现一个高效的数据采集系统。我们可以使用STM32的UART、SPI或I2C接口与各种传感器或外部设备进行通信,并通过GPIO口实现控制功能。在硬件连接完成后,我们可以通过STM32控制FPGA的配置和数据传输。STM32作为主控单元负责与外部设备进行通信和数据处理,而FPGA则用于高速数据采集和实时处理。具体的通信协议取决于连接的设备类型。

UbiSqlserver的博客 1797

YOLO十年演进:从CNN到Transformer再到MoE,我看懂了2026年目标检测的落地风向标

技术永远是为业务服务的,能解决真实问题的技术,才是有价值的。YOLO的十年演进,从CNN到Transformer再到MoE,从来都不是学术上的炫技,而是一步一步解决工业落地的痛点:从让实时检测成为可能,到解决复杂场景的漏检误检,再到打破精度和算力的死局,每一步都踩在了工业落地的真实需求上。很多新入行的朋友,总喜欢追新,今天换Transformer,明天堆MoE,觉得模型越新、参数越大,就越厉害。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 748

Java-springboot生鲜电商项目(五)购物车模块

Java-springboot生鲜电商项目(五)购物车模块购物车功能业务流程(一)购物车列表daomapperservice(二)添加商品到购物车对用户的过滤器开发:因为购物车的功能是用户的行为操作,所以在添加商品到购物车的时候,先判断是否是用户,可以借鉴管理员过滤器的开发filter包中创建UserFilter对过滤器进行config配置coding到这里,我发现有个小小的笔误,我在controller中@PostMapping("")注解中,映射的地址开头有些有“/”有些没有,然后我进行统一处理,全加上

bingbign0607的博客 3588

如何绘制电气绝缘图(GB9706.1-2007和GB9706.1-2020差异)

是用来描述要考虑设备的绝缘状况和它们的值 ,从而便于和相关部门交流和沟通,如权威机构和检测实验室等。本文为绝缘图的实例, 包括所有相关的绝缘路径以及介电强度,爬电距离和电气间隙的值。

学海无涯的专栏 1万+

完整电商项目--项目介绍(1)

项目开发模式 开发模式 : 前后端不分离 后端框架 : Django + Jinja2模板引擎 前端框架 :Vue.js 项目介绍 B2C – 企业对个人 ,既商对客的运营模式 项目前端由 他人开发,合作项目,这里只介绍后端技术。 归纳项目的主要模块 验证: 图形验证、短信验证 用户: 注册、登录、用户中心(基本信息、邮箱激活、收货地址、我的订单、修改密码) 第三方登录: QQ登录 首页广告: 首页广告 商品: 商品列表、商品搜索、商品详情、商品浏览记录 购物车 购物车管理、购物车合并 订单: 确

pythonstrat的博客 1万+

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

jks212454的博客 1063

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JavaWeb项目练习--购物车模块、订单模块

购物车模块 购物车存储方式: 1)保存在session中;此次项目保存在session中 2)保存在cookie中; 3)保存在数据库中: 不同方式的优缺点: 1.Session(Memcached)方式 优点:购物车信息保存在服务端,可以保存1M 信息。 缺点:1)对于大型网站会占有过多的服务器内存资源,造成服务器压力过大。 2)Session保存的信息会在用户退...

一万年行不行的博客 3万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 完整电商项目--(六)商品模块(8):用户浏览记录
下一篇: 完整电商项目--(八)商品订单模块(1):订单结算与 mysql事务
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值