网上书城项目描述(本人原创&可以借鉴经验,但请勿抄袭)

网上书城项目描述

一.项目概述&架构

1.项目概述

最近参与了一个网上书城项目开发,它是一个B2C模式的电商网站,我们在开发过程中采用了前后端分离的开发模式,前端采用了vue框架,后端采用了DRF框架

2.项目模块&功能

1)项目模块(四个部分)

1 2 3 4
用户部分 商品部分 购物车部分 订单部分

2)购物车部分功能

id 功能
1 购物车记录增删改查
2 购物车记录的全选
3 购物车记录的合并

3)使用技术点

id 技术点
1 购物车记录存储
2 购物车记录合并

二.项目具体内容

1)项目需求

用户可以在看到喜欢的书籍时进行添加购物车操作,将喜欢的书添加到我的购物车中,并可以进行在购物车购买操作

2)项目优化(两次优化)

后来根据项目经理要求,为了增加用户的更好使用购物车体验
1.添加了本地未登陆状态下也可添加购物车的功能,
2.并可以在用户登录的时候将本地购物车记录添加和登陆用户账号中购物车的记录进行合并

3)功能实现

1.购物车记录的存储方案设计

1.已登录
  1. 登陆用户的购物车存储在redis中
    原因:1.为了避免用户频繁操作购物车,造成因放在mysql数据库使得服务器频繁进行数据库增删改查压力过大的情况; 2.使用redis查询也更加快)

  2. 存储内容:
    hash数据类型存储购物车中添加的图书id和对应的图书数量
    (因为每个用户要保存多个图书的id和数量的对应关系)

set(集合)数据类型记录用户勾选的书籍id
(因为只需保存勾选的图书id,不需要保存顺序)

2.未登录
  1. 未登录用户的购物车记录存储在客户端
    (为了避免过多的占用服务器存储空间)

  2. 存储在本地cookie中
    记录添加的图书id和对应的数量,以及图书的勾选状态

  3. 使用pickle与base64模块
    因为cookie只能保存字符串数据,于是采用了先使用pickle模块将字典数据先转换为bytes字节流,再使用base64模块将bytes字节流进行base64编码成bytes内容,最后进行decode解码成字符串类型,存储在cookie中,返回来解析cookie中数据亦然。

2.购物车记录的合并方案设计

1.需求

当用户登录时,可以将用户客户端未登陆时存储在本地的购物车记录与用户账号上的购物车记录进行合并,并当发生冲突时,以本地购物车记录为主

2.方案:封装合并记录的函数,并在登陆视图中进行调用

合并不是新的API接口,而是封装一个函数,在原有登陆流程上进行调用合并方法,补充购物车合并的过程。

  1. 封装
    (取出cookie中数据,存储到redis中,并删除cookie中的记录)

2.调用
1)在普通登陆中添加调用
(重写认证中的post视图,在返回响应之前直接添加)
(我查看了认证的源码,发现rest_framework_jwt提供的obtain_jwt_token视图,实际从rest_framework_jwt.views.ObtainJSONWebToken类视图而来,所以就重写了认证视图,继承ObtainJSONWebToken,重写了post方法,并在其中添加了对合并购物车记录方法的调用)

2)在QQ登陆中添加调用
a. 如果是绑定过的用户,在登陆QQ登陆直接生成jwt token返回之前添加对合并函数的调用

b.对于未绑定过的用户, 重写post方法,增加了调用合并购物车记录的函数

4)开发过程中遇到的问题

1.问题:
在进行购物车增加的接口调试中,发现请求不成功,报错信息401,

2.查询:
后来经过查询资料,发现是jwt token认证机制的问题,当浏览器访问访问的时候,会向后端传一个jwt token,但是当用户没有登陆的情况下,传的值为空,而后端只要发现请求,就会校验jwt token的有效性,当发现无效时,就会返回401未认证

3.解决:
重写认证方法,让登录视图跳过DRF框架认证过程,
并在获取user时,try一下,使其不返回异常,而是user为空

4)增删改查

注意: 在进行增删改查时都要进行用户是否登陆的判断,然后进行不同的操作

发布了20 篇原创文章 · 获赞 30 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ever_siyan/article/details/85243297
今日推荐