购物车增加
1. 后端接口设计
请求方式 post
请求参数 sku_id,count,selected
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku_id | int | 是 | 商品sku id |
count | int | 是 | 数量 |
selected | bool | 否 | 是否勾选,默认勾选 |
返回参数 sku_id,count,selected
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku_id | int | 是 | 商品sku id |
count | int | 是 | 数量 |
selected | bool | 是 | 是否勾选,默认勾选 |
购物车数据读写比较频繁,对于已登录用户可以保存在redis中。对于未登录用户可保存在cookie中。
redis保存已登录用户
说明:
- 每个用户可以保存多个商品与其数量对应,所以选择redis哈希类型保存
- 对于勾选状态,只需要保存已勾选商品的sku_id,不要求有序,不重复。所以选择redis的set类型存储
cook保存未登录用户
{ sku_id: { "count": xxx, // 数量 "selected": True // 是否勾选 }, sku_id: { "count": xxx, "selected": False }, ... }
cookie中只能保存字符串,可以使用pickle将上面的数据类型序列化为bytes类型,因为它序列化速度比json要高。
将序列化得结果进行base64编码得到的仍然是bytes再进行encode的到str 设置到cookie中
购物车查询
1. 后端接口设计
请求方式 get /cart/
返回数据
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | int | 是 | 商品sku id |
count | int | 是 | 数量 |
selected | bool | 是 | 是否勾选,默认勾选 |
name | str | 是 | 商品名称 |
default_image_url | str | 是 | 商品默认图片 |
price | decimal | 是 | 商品单价 |
视图的业务逻辑
- 判断用户登录状态
- 登录用户从redis中查询加入购物车的商品
- 未登录用户从cookie中获取加入购物车的shangpin
- 从mysql sku表中查询商品(获取图片,价格等信息)
- 序列化后返回给前端
修改购物车数据
1. 后端接口设计
请求方式 : PUT /cart/
请求参数: JSON 或 表单
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku_id | int | 是 | 商品sku id |
count | int | 是 | 数量 |
selected | bool | 否 | 是否勾选,默认勾选 |
返回数据: JSON
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku_id | int | 是 | 商品sku id |
count | int | 是 | 数量 |
selected | bool | 是 | 是否勾选,默认勾选 |
需要更新的数据只有 数量和勾选状态
业务逻辑:
- 将接收的数据进行反序列化(验证数据的合法性)
- 判断用户登录状态
- 登录用户从更新对应redis中的数据
- 未登录用户更新cookie信息
删除购物车数据
1. 后端接口设计
请求方式 : DELETE /cart/
请求参数:
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku_id | int | 是 | 商品sku id |
返回数据:无,状态码204
- 将请求数据进行反序列化验证sku_id是否存在
- 判断用户登录状态
- 如果登录 从redis中删除指点sku
- 如果未登陆了从cookie中删除,当然要先判断cookie(cookie是否存在,cookie中是否存在sku_id)
- 返回状态码
购物车全选
1. 后端接口设计
请求方式 : PUT /cart/selection/
请求参数: JSON 或 表单
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
selected | bool | 是 | 是否全选,true表示全选,false表示取消全选 |
返回数据:JSON
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
message | str | 是 | ok |
2. 后端实现
- 进行反序列化验证请求参数
- 判断用户是否登录状态
- 如果登录修改redis数据(查询用户的所有商品id,将所有id加入选中集合中)
- 如果未登录修改cookie
登录合并购物车
方案1:在用户登录时,将cookie中购物车数据合并到redis中,并清除cookie中的购物车数据。缺点有多少种登录方式就要调用多少上面的方法。而且要重写登录方法。
方案2:修改购物车查询接口设计,判断用户登录和cookie存在同时成立。则需要合并。