图书商城

项目实战介绍

项目:图书商城

技术:Django2.2 + python3.7+mysql5.7

特点:

  • 完整的完成一个在线商城的全流程
  • 多图上传,短信验证,阿里支付,云服务器部署

功能:

前台:

  • 注册,登录,首页,列表,详情,购物车,订单,个人中心

后台:

  • 登录,会员管理,图书分类,图书商品,订单,权限管理

设计数据字典:

数据字典就是根据项目的功能和要求,去设计对应的数据库,表和字段。

会员表 user

ID 用户名,密码,邮箱,手机号。。。。

项目结构搭建:

  1. bookshop/
  2. ├── bookshop
  3. ├── __init__.py
  4. ├── settings.py
  5. ├── urls.py
  6. └── wsgi.py
  7. ├── manage.py
  8. ├── myadmin
  9. ├── __init__.py
  10. ├── admin.py
  11. ├── apps.py
  12. ├── migrations
  13. ├── __init__.py
  14. ├── models.py
  15. ├── tests.py
  16. ├── urls.py
  17. └── views.py
  18. ├── myhome
  19. ├── __init__.py
  20. ├── admin.py
  21. ├── apps.py
  22. ├── migrations
  23. ├── __init__.py
  24. ├── models.py
  25. ├── tests.py
  26. ├── urls.py
  27. └── views.py
  28. ├── static
  29. ├── myadmin
  30. ├── myhome
  31. └── uploads
  32. └── templates
  33. ├── myadmin
  34. └── myhome

后台开发:

会员管理:

  1. 查看会员列表,详情信息,禁用,【修改,删除,添加】

会员模型:

列名 字段 类型 说明
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 存储头像的路径

图书分类:

  1. 添加,列表,删除,编辑

图书分类模型:

列名 字段 类型 说明
ID id 主键
分类名称 name 字符串
父级ID Pid 数字
路径 path 字符串
  1. 图书分类:
  2. ID 分类名称 父级ID 路径path
  3. 1 人文社科 0 0
  4. 2 小说 0 0
  5. 3 经济管理 0 0
  6. 4 古籍 1 01
  7. 5 经部。 4 014
  8. 6 当代小说。 2
  9. ---
  10. 服务分类
  11. id 分类名。 父级ID 路径path
  12. 1 服装。 0 0
  13. 2 男装。 1 01
  14. 3 女装。 1 01
  15. 4 男正装。 2 012
  16. 5 衬衫。 4 0124

图书商品:

添加,删除,修改,列表

图书模型:

列名 字段名 类型 说明
ID id 主键
所属分类 typeid 一对多
书名 title
推荐语 tuijian
作者 author
出版社 Publisher
出版时间 Pub_date
定价 Price
库存数量 Num
国际书号ISBN Isbn
详情介绍 Context

图书封面图集模型:

列名 字段名 类型 说明
所属图书 bookid 一对多
封面图url img_url

订单,

权限管理

分页优化

自定义模版标签

  1. 在应用中创建一个 templatetags 包

  2. 在templatetags包中 创建自定义模块 pagetag.py

  3. 在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)

  1. 4.
  2. 使用自定义的过滤器或标签
  3. ```html
  4. <!-- index.html. 在使用自定义标签或过滤器时,需要导入 -->
  5. {% load pagetag %}
  6. {{ 'abc'|chuan_upper }}
  7. {% jia 1 2 %}

富文本编辑器

把ueditor作为项目中的应用,加入到项目中

  1. ueditor整个拷贝到项目中,放到和manage.py同级目录中

  2. 修改web/settings.py文件中的应用配置,把ueditor加入到应用中

  3. 修改根路由文件,配置富文本编辑器的路由地址

    1. path('ueditor/', include('ueditor.urls')),
  1. 把一下html代码加入到需要使用富文本编辑的html模版中
    1. <!-- 加载编辑器的容器 -->
    2. <script id="container" name="content" type="text/plain">
    3. 这里写你的初始化内容
    4. </script>
    5. <!-- 配置文件 -->
    6. <script type="text/javascript" src="/ueditor/UE/ueditor.config.js"></script>
    7. <!-- 编辑器源码文件 -->
    8. <script type="text/javascript" src="/ueditor/UE/ueditor.all.js"></script>
    9. <!-- 实例化编辑器 -->
    10. <script type="text/javascript">
    11. var ue = UE.getEditor('container');
    12. </script>
  1. 注意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”

    1. # 验证码
    2. def verifycode(request):
    3. #引入绘图模块
    4. from PIL import Image, ImageDraw, ImageFont
    5. #引入随机函数模块
    6. import random
    7. #定义变量,用于画面的背景色、宽、高
    8. bgcolor = (random.randrange(20, 100), random.randrange(
    9. 20, 100), 255)
    10. width = 100
    11. height = 25
    12. #创建画面对象
    13. im = Image.new('RGB', (width, height), bgcolor)
    14. #创建画笔对象
    15. draw = ImageDraw.Draw(im)
    16. #调用画笔的point()函数绘制噪点
    17. for i in range(0, 100):
    18. xy = (random.randrange(0, width), random.randrange(0, height))
    19. fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
    20. draw.point(xy, fill=fill)
    21. #定义验证码的备选值
    22. str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    23. # str1 = '123456789'
    24. #随机选取4个值作为验证码
    25. rand_str = ''
    26. for i in range(0, 4):
    27. rand_str += str1[random.randrange(0, len(str1))]
    28. #构造字体对象
    29. font = ImageFont.truetype('FreeMono.ttf', 23)
    30. #构造字体颜色
    31. fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    32. #绘制4个字
    33. draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    34. draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    35. draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    36. draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    37. #释放画笔
    38. del draw
    39. #存入session,用于做进一步验证
    40. request.session['verifycode'] = rand_str
    41. #内存文件操作
    42. import io
    43. buf = io.BytesIO()
    44. #将图片保存在内存中,文件类型为png
    45. im.save(buf, 'png')
    46. #将内存中的图片数据返回给客户端,MIME类型为图片png
    47. return HttpResponse(buf.getvalue(), 'image/png')

配置url

  • 在urls.py中定义请求验证码视图的url
  1. from . import viewsUtil
  2. urlpatterns = [
  3. url(r'^verifycode/$', viewsUtil.verifycode),
  4. ]

显示验证码

  • 在模板中使用img标签,src指向验证码视图
  1. <img id='verifycode' src="/verifycode/" alt="CheckCode"/>

验证

  • 接收请求的信息,与session中的内容对比
  1. from django.http import HttpResponse
  2. def verifycodeValid(request):
  3. vc = request.POST['vc']
  4. if vc.upper() == request.session['verifycode']:
  5. return HttpResponse('ok')
  6. else:
  7. return HttpResponse('no')
  • 配置验证处理的url
  1. urlpatterns = [
  2. url(r'^verifycodeValid/$', views.verifycodeValid),
  3. ]

第三方

  • 可以在网上搜索“验证码”,找到一些第三方验证码提供网站,阅读文档,使用到项目中

mysql存储过程

利用mysql存储过程,给会员表批量添加数据

  1. \d //
  2. create procedure p1()
  3. begin
  4. set @i=0;
  5. while @i<1000 do
  6. insert 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');
  7. set @i=@i+1;
  8. end while;
  9. end;
  10. //
  11. \d ;
  12. call p1();