图书商城
项目实战介绍
项目:图书商城
技术:Django2.2 + python3.7+mysql5.7
特点:
- 完整的完成一个在线商城的全流程
- 多图上传,短信验证,阿里支付,云服务器部署
功能:
前台:
- 注册,登录,首页,列表,详情,购物车,订单,个人中心
后台:
- 登录,会员管理,图书分类,图书商品,订单,权限管理
设计数据字典:
数据字典就是根据项目的功能和要求,去设计对应的数据库,表和字段。
会员表 user
ID 用户名,密码,邮箱,手机号。。。。
项目结构搭建:
bookshop/├── bookshop│ ├── __init__.py│ ├── settings.py│ ├── urls.py│ └── wsgi.py├── manage.py├── myadmin│ ├── __init__.py│ ├── admin.py│ ├── apps.py│ ├── migrations│ │ ├── __init__.py│ ├── models.py│ ├── tests.py│ ├── urls.py│ └── views.py├── myhome│ ├── __init__.py│ ├── admin.py│ ├── apps.py│ ├── migrations│ │ ├── __init__.py│ ├── models.py│ ├── tests.py│ ├── urls.py│ └── views.py├── static│ ├── myadmin│ ├── myhome│ └── uploads└── templates├── myadmin└── myhome
后台开发:
会员管理:
查看会员列表,详情信息,禁用,【修改,删除,添加】
会员模型:
| 列名 | 字段 | 类型 | 说明 |
|---|---|---|---|
| ID | id | 主键 | |
| 用户名 | username | Varchar | |
| 密码 | Password | char(80) | |
| 手机号 | Phone | char(11) | 唯一索引 |
| 性别 | Sex | Tinyint | |
| 年龄 | Age | Tinyint | |
| 注册时间 | Additive | Datetime | |
| 最后登录时间 | Savetime | Datetime | |
| 状态 | Status | Tinyint | 默认0,1禁用, |
| 头像 | face_url | Varchar | 存储头像的路径 |
图书分类:
添加,列表,删除,编辑
图书分类模型:
| 列名 | 字段 | 类型 | 说明 |
|---|---|---|---|
| ID | id | 主键 | |
| 分类名称 | name | 字符串 | |
| 父级ID | Pid | 数字 | |
| 路径 | path | 字符串 |
图书分类:ID。 分类名称 父级ID 路径path1。 人文社科 0 0,2。 小说 0 0,3。 经济管理 0 0,4。 古籍 1 0,1,5。 经部。 4 0,1,4,6。 当代小说。 2---服务分类id。 分类名。 父级ID。 路径path1。 服装。 0。 0,2。 男装。 1 0,1,3。 女装。 1。 0,1,4。 男正装。 2。 0,1,2,5。 衬衫。 4。 0,1,2,4,
图书商品:
添加,删除,修改,列表
图书模型:
| 列名 | 字段名 | 类型 | 说明 |
|---|---|---|---|
| ID | id | 主键 | |
| 所属分类 | typeid | 一对多 | |
| 书名 | title | ||
| 推荐语 | tuijian | ||
| 作者 | author | ||
| 出版社 | Publisher | ||
| 出版时间 | Pub_date | ||
| 定价 | Price | ||
| 库存数量 | Num | ||
| 国际书号ISBN | Isbn | ||
| 详情介绍 | Context |
图书封面图集模型:
| 列名 | 字段名 | 类型 | 说明 |
|---|---|---|---|
| 所属图书 | bookid | 一对多 | |
| 封面图url | img_url |
订单,
权限管理
分页优化
自定义模版标签
在应用中创建一个 templatetags 包
在templatetags包中 创建自定义模块 pagetag.py
在pagetag.py模块文件中,自定义标签或过滤器 ```python
/web/myadmin/templatetags/pagetag.py
from django import template
register = template.Library()
自定义过滤器
@register.filter def chuan_upper(val): return val.upper()
自定义 标签
@register.simple_tag def jia(a,b): return int(a)+int(b)
4.使用自定义的过滤器或标签```html<!-- index.html. 在使用自定义标签或过滤器时,需要导入 -->{% load pagetag %}{{ 'abc'|chuan_upper }}{% jia 1 2 %}
富文本编辑器
把ueditor作为项目中的应用,加入到项目中
ueditor整个拷贝到项目中,放到和manage.py同级目录中
修改web/settings.py文件中的应用配置,把ueditor加入到应用中
修改根路由文件,配置富文本编辑器的路由地址
path('ueditor/', include('ueditor.urls')),
- 把一下html代码加入到需要使用富文本编辑的html模版中
<!-- 加载编辑器的容器 --><script id="container" name="content" type="text/plain">这里写你的初始化内容</script><!-- 配置文件 --><script type="text/javascript" src="/ueditor/UE/ueditor.config.js"></script><!-- 编辑器源码文件 --><script type="text/javascript" src="/ueditor/UE/ueditor.all.js"></script><!-- 实例化编辑器 --><script type="text/javascript">var ue = UE.getEditor('container');</script>
- 注意css对富文本编辑器的影响
/static/myadmin/css/app.css. 379行
会话控制
在请求中,http是无状态请求协议。http是无法记录用户的请求状态,比如不知道你是第几次请求,是在什么情况下,在之前或之后访问过哪里?但是在一个web项目中有时是需要记录一些状态的,比如是否登录,是否查看过什么页面,获取记录用户的一些喜好等等。
可以使用一些技术手段去记录一些信息:
cookie
- cookie是在浏览器中记录一些数据,并且浏览器在访问相同服务器时会主动携带该数据
- 如果cookie丢失,或者换了一个浏览器再访问,那么cookie就不存在了。
- 如果一些敏感数据,存储在浏览器中,就很危险。
session
- session是在服务器中记录相关状态数据(文件,数据库),并且每个数据生成一个唯一的id,叫做sessionID
- 把这个sessionID作为cookie存储在用户的浏览器中。
- 相对来说,可记录的数据量比较大,数据相对安全。
- session是依赖cookie的。
中间件
中间件就是介于请求和响应之间的一个组件,可以对请求或者响应进行一些处理或拦截。
比如,现在用到的CSRF中间件。
验证码
- 在用户注册、登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力
- 使用验证码也是一种有效的防止crsf的方法
验证码视图
新建viewsUtil.py,定义函数verifycode
此段代码用到了PIL中的Image、ImageDraw、ImageFont模块,需要先安装Pillow(3.4.1)包,详细文档参考 http://pillow.readthedocs.io/en/3.4.x/
Image表示画布对象
ImageDraw表示画笔对象
ImageFont表示字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”
# 验证码def verifycode(request):#引入绘图模块from PIL import Image, ImageDraw, ImageFont#引入随机函数模块import random#定义变量,用于画面的背景色、宽、高bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)width = 100height = 25#创建画面对象im = Image.new('RGB', (width, height), bgcolor)#创建画笔对象draw = ImageDraw.Draw(im)#调用画笔的point()函数绘制噪点for i in range(0, 100):xy = (random.randrange(0, width), random.randrange(0, height))fill = (random.randrange(0, 255), 255, random.randrange(0, 255))draw.point(xy, fill=fill)#定义验证码的备选值str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'# str1 = '123456789'#随机选取4个值作为验证码rand_str = ''for i in range(0, 4):rand_str += str1[random.randrange(0, len(str1))]#构造字体对象font = ImageFont.truetype('FreeMono.ttf', 23)#构造字体颜色fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))#绘制4个字draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)#释放画笔del draw#存入session,用于做进一步验证request.session['verifycode'] = rand_str#内存文件操作import iobuf = io.BytesIO()#将图片保存在内存中,文件类型为pngim.save(buf, 'png')#将内存中的图片数据返回给客户端,MIME类型为图片pngreturn HttpResponse(buf.getvalue(), 'image/png')
配置url
- 在urls.py中定义请求验证码视图的url
from . import viewsUtilurlpatterns = [url(r'^verifycode/$', viewsUtil.verifycode),]
显示验证码
- 在模板中使用img标签,src指向验证码视图
<img id='verifycode' src="/verifycode/" alt="CheckCode"/>
验证
- 接收请求的信息,与session中的内容对比
from django.http import HttpResponsedef verifycodeValid(request):vc = request.POST['vc']if vc.upper() == request.session['verifycode']:return HttpResponse('ok')else:return HttpResponse('no')
- 配置验证处理的url
urlpatterns = [url(r'^verifycodeValid/$', views.verifycodeValid),]
第三方
- 可以在网上搜索“验证码”,找到一些第三方验证码提供网站,阅读文档,使用到项目中
mysql存储过程
利用mysql存储过程,给会员表批量添加数据
\d //create procedure p1()beginset @i=0;while @i<1000 doinsert into myadmin_users values(null,concat('user',@i),'123446',concat('1370138',@i),1,20,'2020-01-08 06:45:44','2020-01-08 06:45:44',0,'/static/myadmin/img/user05.png');set @i=@i+1;end while;end;//\d ;call p1();
