美多商城项目(一)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 美多商城项目(一)

美多商城项目(一)

1.在给用户授权的时候,用到了一个%,表示的是任何ip都可以连接这个数据库。换句话说,如果你换了电脑,你也是可以进行连接数据库继续开发的。

  1. grant all on meiduo_mall.* to 'meiduo'@'%';

1.用户信息的存储

用户表分析

  1. ID
  2. 用户名
  3. 密码
  4. 手机号
  5. 邮箱
  6. 是否管理员is_admin
  7. 是否注销is_delete

想要生成表,需要定义一个模型类。Django里面不需要定义模型类了。

Django的认证系统已经为我们提供了一个用户模型类,还提供了认证和授权功能。

Django认证机制依赖于session机制,但我们使用JWT认证机制。

  1. is_staff是否可以访问admin站点,相当于之前我们用的is_admin
  2. is_superuser超级管理员

系统的模型类中,缺少我们需要的一些字段,那么我们可以自定义用户模型类,采用继承就可以解决这个问题。在迁移之前,我们需要在配置文件中设置一下,否则,系统不知道我们定义了模型类。

  1. # AUTH_USER_MODEL = '子应用.模型类'
  2. # 这里不是路径,只是一个格式,注意即可。
  3. AUTH_USER_MODEL ='users.User'

如果我们直接使用了系统的模型类,那么那张用户表叫做auth_users。

2.设计接口的思路

我们在接到了工作任务的时候,那么我们按照下面的思路来思考。

业务功能:分析子业务(子功能),每个子业务设计一个API接口

API设计过程

  1. -接口的请求方式,如GET POST PUT
  2. -接口的URL路径定义
  3. -需要前端传递的数据及数据格式(如路径参数、查询字符串、请求体表单、JSON等)
  4. -返回给前端的数据及数据格式

2.1用户注册子业务

1.获取短信验证码

2.用户名是否存在

3.手机号是否存在

4.注册信息的保存

四个子业务,那么设计四个API接口。

2.1.1获取短信验证码

  1. API: GET /sms_codes/<mobile>/
  2. # /sms_codes/?P<mobile>1[3-9]\d{9}/
  3. 参数:
  4.    通过url传递手机号
  5. 响应:
  6.    {
  7.        "message":"OK"
  8.    }

补充功能

1.短信发送60s间隔限制(同一个手机在60之内只发一个短信验证码)

2.redis管道的使用:

可以向redis管道中添加多个redis命令,然后一次性进行执行(可以做到只连接一次redis,那么网站的效率会高一点。)

2.1.2 异步发短信

为什么使用:传统的方式造成用户长时间的等待

解决

1.将发送短信的代码抽取成一个函数

2.在短信发送API接口中创建一个进程调用发送短信函数。

问题

1.如果客户端请求较多,就会造成服务器压力过大。

我们可以使用稍后介绍的celery

2.1.3Celery异步任务队列

本质:通过提前创建的进程调用函数来实现异步的任务。

创建的进程可以在不同的服务器上。

概念

1.任务执行者( worker):提前创建的进程

2.任务发出者:发出任务信息,让执行者去调用某个函数( 任务函数)

3.中间人( broker):存放任务消息。

特点

1.任务执行者的进程可以单独在其他电脑上进行创建。

2.中间人又叫做任务队列,先添加到队列中的任务消息会先被worker所执行。

3.生产者-消费者模型。

注意:中间人可以是rabbit-mq,也可以是redis,我们使用redis。

使用

1.安装

  1. pip install celery

2.创建一个Celery类的对象并进行配置,是为了配置中间人的地址。

  1. # main.py
  2. from celery importCelery

  3. # 创建Celery类的对象
  4. celery_app =Celery('demo')

  5. # 加载配置
  6. celery_app.config_from_object('配置文件的包路径')
  7. # config.py
  8. # 设置中间人地址borker
  9. # broker_url = 'redis://<host>:<port>/<db>'
  10. broker_url ='redis://127.0.0.1:6379/3'

3.封装任务函数

  1. @celery_app.task(name='send_sms_code')
  2. def send_sms_code(a,b):
  3.    # ...
  4.    pass

4.启动celery的worker( 创建工作的进程)

  1. celery -A 'celery_app对象所在文件包路径' worker -l <日志级别>

日志级别:critial fatal、error、warn、info、debug

5.发出任务消息

  1. send_sms_code.delay()

2.2用户名是否存在

获取用户名的数量。

  1. API:GET /usernames/(?P<username>\w{5,20})/count/
  2. 参数:
  3.    通过url地址传递用户名
  4. 响应:
  5.    {
  6.        "username":"用户名",
  7.        "count":"数量"
  8.    }

2.3手机号是否存在

获取手机号的数量。

  1. API: GET /mobiles/(?P<mobile>1[3-9]\d{9})/count/
  2. 参数:
  3.    通过url地址传递手机号
  4. 响应:
  5.    {
  6.        "mobile":"手机号",
  7.        "count":"数量"
  8.    }

3.通过域名访问网站

静态文件服务器:127.0.0.1:8080 ---> www.ethanyan.site:8080

后端API服务器:127.0.0.1:8000 -----> api.ethanyan.site:8000

域名对应IP

通过域名访问网站 --->DNS解析( 根据域名获取对应的ip)--->再访问ip对应的服务器。

通过域名访问网站 --->先到本地 /etc/host文件中查找域名和ip对应关系,如果找到,直接根据ip访问对应的服务器,不再进行DNS解析,如果找不到,才会进行DNS解析过程。

注意:如果想通过一个域名访问到Django网站服务器,需要将域名添加到 ALLOWED_HOSTS中。

4.一些小的知识点

1.日志的记录等级,常见四种大小关系是:

  1. DEBUG < INFO < WARNING < ERROR

只有记录级别大于或者等于该级别的信息才会输出。

5.跨域地址

同源地址:对于两个url地址,如果协议,ip和端口完全一致,这样的地址就是同源地址,否则就不是同源地址。

跨域请求:客户端发出请求时,如果源请求地址和被请求地址不是同源,这个请求就是跨域请求。

源请求地址: http://www.ethanyan.site:8080/

被请求地址: http://api.ethanyan.site:8000/

浏览器在发起ajax跨域请求时,会有CORS跨域请求的限制

在发起跨域请求时,在请求中携带一个请求头:

Origin:源请求地址

被请求的服务器在返回响应时,如果允许源地址对其进行跨域请求,需要在响应时携带一个响应头:

Access-Control-Allow-Origin:源请求地址

浏览器如果发现被请求的服务器在返回响应时,没有携带 Access-Control-Allow-Origin:源请求地址响应头,浏览器会直接将请求驳回,然后进行报错。

  1. <imgsrc=''>

  2. <formaction='提交url地址'>
  3.    ...
  4.    <inputtype='submit'value='提交'/>
  5. </form>

CSRF跨站请求是不是跨域请求?

答:是跨域请求。

总结

1.Django认证系统用户模型类

  1. classUser(AbstractUser):
  2.    mobile = models.CharField(max_length=11,verbose_name='手机号')
  3.    ....

AUTHUSERMODEL = 'users.User'

2.接口设计思路

分析子业务,每个子业务实现一个API接口

a.请求方式和URL地址

b.接口所需的参数和格式

c.接口的响应数据和格式

3.短信验证码获取

基本业务逻辑

a.随机生成6位数字作为短信验证码

b.在redis中存储短信验证码内容,以 sms_<mobile>为key,以验证码内容为value

c.使用云通讯给手机号发送短信

d.返回应答,短信发送成功

补充两个功能:

a.短信发送60s间隔限制

b.redis管道的使用

4.本地域名设置

  1. /etc/hosts

5.跨域请求

同源地址:协议,ip,port完全一致

跨域请求:浏览器发请求时,如果源地址和被请求地址不是同源,这个请求就是跨域。

浏览器针对Ajax跨域请求,有CORS跨域请求的限制。

6.celery异步任务队列

使用celery异步发送短信验证码,解决用户点击获取短信验证码之后,长时间等待。

7.用户名和手机号是否存在

  1. 获取用户名数量
  2. 1.根据用户名查询数据库,获取查询结果数量
  3. 2.返回用户名数量
相关文章
|
7月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的成都锦城学院校内订餐系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的成都锦城学院校内订餐系统的详细设计和实现(源码+lw+部署文档+讲解等)
55 4
|
8月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的城投公司企业人事管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的城投公司企业人事管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
7月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的大学生二手电子产品交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的大学生二手电子产品交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
86 0
|
7月前
|
前端开发 Java
基于SSM框架的手机商城项目
基于SSM框架的手机商城项目
89 0
|
7月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的“涛宝”大学生二手物品交易商城的详细设计和实现
基于SpringBoot+Vue的“涛宝”大学生二手物品交易商城的详细设计和实现
34 0
|
安全 Java 数据安全/隐私保护
【Java项目】基于SpringBoot+Vue的校园二手商品交易平台(一)
【Java项目】基于SpringBoot+Vue的校园二手商品交易平台
151 0
|
Linux 数据库 文件存储
美多商城项目(六)
美多商城项目(六)
|
存储 安全 数据安全/隐私保护
美多商城项目(二)
美多商城项目(二)
|
存储 搜索推荐 NoSQL
美多商城项目(七)
美多商城项目(七)
|
存储 NoSQL 前端开发
美多商城项目(八)
美多商城项目(八)