码云:https://gitee.com/ming_cpp/meiduo18
C2B模式(消费者到企业的商业模式),相类似网站包括:京东,淘宝,海尔商城,尚品宅配等。
1,用户部分
2,商品部分
3,购物车部分
4,商品订单备份
5,用户支付部分
6,上线程序的配置
基本功能:用户注册,登录,密码的重置,第三方登录
用户注册
1,图片验证码
流程分析:
1,前端生成uuid随机字符串
2,后端生成图片验证码发送给前端,将图形验证码的存入到redis中
2,短信验证码
1,检查图片的验证码
2,检验是否是在60s内是否已经发送过
3,生成短信验证码
4,保存发送的短信验证码
5,发送短信(第三方平台发送:云通讯)
3,判断用户名是否存在
1,用户输入用户名之后ajax局部刷新页面
2,后台查询数据库用户是否存在
3,返回数据给前端
4,判断手机号码是否已经存在
同3
技术点:前后端的域名不相同,涉及到csrf跨站请求伪造的问题;
Csrf相关概念:
1,域=协议+域名+端口,在两个域中,以上三者中任意一个条件不同,均涉及到跨域的问题;
2,浏览器的策略
1,对于简单的请求,浏览器发送请求,但是得到请求之后会检验响应头中是否有当前的域中,如果没有则会在浏览器中报错;
2,对于复杂的请求,浏览器会先发送一个option请求,询问服务器是否支持跨域,如果响应头中的域名允许,才会发送相对应的请求来获取数据,并交给js进行处理。
3,Python的django中的跨域处理的相关模块django-cors-headers
**技术点:前端用户将图片验证码发送给后台之后,第三方平台发送短信的过程中会有网络的阻塞程序继续往下执行,进而影响用户体验效果;
解决方案:采用celery进行短信验证码的异步发送;**
Celery概念:分布式异步任务队列调度框架:
1,支持定时任务和异步任务两种方式
2,组成:大概分为四个部分client客户端发送数据,broker中间件(redis数据库,消息队列),worker(任务的执行者),backend(执行worker任务的执行结果)
3,可以开启多进程也可以是多线程
4,应用场景:在某一个任务的执行过程中,会涉及到耗时的操作,但是这个耗时操作并不会影响后续的程序的执行,此时就可以用celery来异步执行这些任务;
JWTtoken的相关了解
cookies的使用目的
1.http协议本生是一种无状态的协议,假如用户每次发送请求过来将用户名和密码在后端进行验证后才可以登录到某些界面才可以进行操作,当客户端再次请求服务器时,又要重新进行认证;
2.解决方法:在客户端设置cookie并在本地设置session存储用户的敏感信息,从而来记录当前用户登录的状态,如果用户量再次请求服务器,将cookie带给服务器,服务器查询session获取用户信息,进行下一步操作。
3.客户端比较多的情况下,seession中默认会存在内存,随着用户量的增加服务器的压力就会变大;
传统的cookies显示出来的问题
单点登录的概念
用户在不同的设备中进行登录,服务器端不用维护用户的相关信息,在每次登录的过程中都由客户端将自己的用户信息发送过来,服务端进行解析来获取用户的相关信息
token认证的机制
1.用户携带用户名和密码来后端进行验证
2.服务器端验证通过后对为当前用户生成token
3.将token返回给前端,记录用户的信息
4.用户再次请求服务器的时候,服务端解析token相关的信息,验证用户
确定用户状态,进行 相关操作
备注:
1.jwt的组成第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
2.secretkey是存储在服务器端的,如果secret key
用户登录JWT认证的的流程源代码(待继续理解)
qq登录流程oauth2的认证流程分析
1.用户向美多网站发送qq注册的请求
2.美多网站向用户返回qq登录的页面
3.用户在qq登录的界面向qq的服务器发送qq用户名和密码发起登录的请求
4.qq服务器认证成功之后将用户引导到回调的网址中,并返回给用户qq服务器的token值
5.用户重定向到美多页面并携带了qq服务器发送的token
6.后端接收到token后向qq服务器请求access token
7.qq服务器返回access token
8.美多服务器通过access token来向qq服务器来获取用户的openid
9.通过id来查询用户是否已经在美多商城注册
10.用户已经注册直接返回用户的access token值
11.用户没有账号,生成注册的access token,(载荷openid)重新注册信息发送给后端
12.后端接收到数据之后创建对象并将qq用户的openid和账号进行绑定
忘记密码的功能的实现
1.用户发送过来请求,携带用户名和图片验证码
2.后端验证图片验证码,通过账号查询用户,将用户的电话号码部分返回给前3.端,并生成发送短信的access token(载荷mobile)值
4.前端填写手机号码验证码并携带access token到后端
5.后端接收到手机号码校验(正确性,发送时间间隔),通过手机号码站到用户对象,生成密码修改的access token(载荷uer obj)值
6.前端用户填写新的密码之后,携带access token到后端重置密码
djangorestframework中的实现JWT token的模块itsdangerous的使用
个人信息
个人信息是用户的私有信息,必须是登录用户才可以访问,并且值可以访问自己的相关信息
1.用户个人信息的展示流程
2.前端在页面被加载完成之后向后端发送请求用户数据
3.后端通过rest_framework.permissions.IsAuthenticated判断用户是否登录,并获取用户的user模型
4.将用户的详细信息返回给前端,在前端进行展示
5.用户个人中心的信息中有一项是用户的邮箱是否激活
1.用户填入邮箱点击保存后端接收到邮箱后异步发出邮件,链接中包含access token(载荷uer id& email)
2.邮件中包含token值,在用户点击邮件中的链接之后向前端发送激活的请求
3.后端验证access token合法性,DRF中的序列化器update的方法,在序列化器中create方法中将用户的email字段更改为激活状态
4.将用户的对象返回给前端
技术点:
1.django中发送邮件的配置信息
2.利用celery来实现异步的邮件发送
DRF中序列化器的嵌套
1,DRF中的ReadOnlyModelViewSet中将请求方式与资源状态进行了绑定,在这里我们只需要从数据库中去数据所以直接就可以继承ModelSerializer这个类
2,view视图中的action==‘list’(即前端url不带参数)说明前端要获取所有的省份
3,view视图中的action!=‘list’(即前端url带参数)说明前端要获取所有的省份底下的行政区划
4,在这个返回的过程中如果前端页面返回的url中返回的带有参数则返回省份
1.DRF的扩展类中的选择以及序列化器的嵌套调用方法
2.对DRF的扩展集的理解
3.Views django 中的原始的Views
4.APIView继承类django中的Views,同时提供了用户认证,权限认证,权限认证,节流认证,分页,序列化等方法
5.GenericAPIView 继承了APIView:在这个类中实现了两个类实行和三个类方法
6.ListModelMixin 实现了list方法与get_queryset(),paginate_queryset,get_serializer
7.ListAPIView 可用的子类GenericAPIView、ListModelMixin 是上面两种方法的子类
8.ViewSetMixin 实现了view = MyViewSet.as_view({'get': 'list', 'post': 'create'})
基本功能:提交订单,我的订单,订单评价
提交订单
**文件上传的流程**
**
1.docker是一种虚拟化的技术,我们可以将docker视为一种容器,在容器的内部可以运行服务,
2.Docker本身是一种C/S架构的程序,Docker客户端需要向服务器发送请求,服务器完成所有的工作之后返回给客户端结果;
电商类型的网站首页的访问评率较大,每次获取首页过程中去对数据库进行查询显然不太合理,除了使用传统意义上的缓存实现之外,我们可以使用首页静态化的技术,即将动态生成的html页面生成保存成静态文件,在用户访问的过程中直接将静态文件发送给用户
优点:可以缓解数据库压力,并且可以提高用户访问的网站的速度,提高用户体验
3.带来的问题是:用户在页面中动态生成的部分数据如何处理
1.>在静态页面加载完成之后,通过js的代码将动态的请求发送到后天请求数据,但是大部分数据均是静态页面中的数据,
2.>静态生成的页面因为并没有实时更新,会出现部分商品的静态化页面中的数据和数据库中实时更新的数据有差异
4.应用场景:经常容易访问但是,数据的变动并不是太大的一些页面可以考虑使用静态化技术
5.难点GoodsCategory,GoodsChannel两个表格之间的关系设计以及获取商城商品分类的菜单
1>.首先是GoodsChannel,将所有的商品的频道取出按照组号和组内顺序排序
2>.排序后将数据以categories[group_id] = {'channels': [], 'sub_cats': []}的形式存入到有个有序的字典中
3>.channels的值为存储的是频道的相关信息(例如手机,相机,数码)
4>.sub_cats中存储的值是该频道下的GoodsCategory相关信息(例如手机通讯,手机配件...相关,根据GoodsChannel数据结构表中顶级类别来查询子类别)
5>.分别为顶级类别下的子类别对象添加一个sub_cats的列表,来存储此类别下的所有GoodsCategory的queryset对象
难点 商品详情页面的数据结构
1. 通过sku id来取出此sku商品的SPU对应的所有存在的商品组合 循环数据库中所有的商品选项,将商品的选项与sku
2.id来做对应,返回上面的数据类型
3. 相同的SPU对应的不同的SKU,返回的specs是相同的,例如如果同属于手机这个SPU的Iphone6手机和Iphone7手机,返回的specs是相同的,若假设手机品牌只有屏幕大小不相同,则返回的数据类型
4. 前端通过传入的sku id来取值生成的详情页面,从同一份数据数据中拿的值,就会避免重复,例如Iphone6的只是取出所有的Iphone6的所有的信息生成静态页面,传入的sku id不同得到的页面效果不同,通过不同的id也可以找到不同的商品的详情页面
5.细节完善在运营人员相关修改商品信息,要在后端实现,自动刷新详情的页面的数据,自动触发静态页面的生成,利用了django中的ModelAdmin,在数据发生变动之后自动进行更新相关数据
技术点
详情页面中的热销商品每个页面加载完成之后都会来向后端请求数据,但是热销商品却不经常发生变化或者是在一段时间内根据相关字段统计生成返回给前端即可,所有使用缓存的方式存储热销商品是最合理的方式,避免了数据的链接,减少了服务器的压力,充分的利用了缓存的响应速度也比较快可以提高用户的体验
商品列表页面的展示
商品数据动态的从后端获取,其他部分生成静态化页面
技术点:
1.DRF框架中过滤,排序,分页,序列化器数据的返回
2.适当使用到了DRF提供的扩展类ListAPIView来简化代码
技术点
安装
在配置文件中配置haystack使用的搜索引擎后端
SKU索引数据模型类
在templates目录中创建text字段使用的模板文件
手动生成初始索引
创建序列化器
创建视图
定义路由
数据类型的设计原则:
1>.尽量将cookies中的数据类型格式与redis数据库中数据类型设计成形同的
2>.对redis数据库的相关操作
3>.{sku id :[count,True]}数据中sku id:商品的id,count:购物车中数据的商品的个数;True或者False代表是否被选中
4>.将对数据的操作封装成一个扩展集,在视图中继承扩展类