- 1-1 课程导学
- 2-1 Pycharm的安装和简单使用
- 2-2 MySQL和Navicat的安装和使用
- 2-3 Windows和Linux下安装Python2和Python3
- 2-4 虚拟环境的安装和配置
- 2-5 Vue开发环境搭建
- 2-6 资源获取方式和提问方式
- 3-1 项目初始化
- 3-2 User Model设计
- 3-3 Goods Model设计
- 3-4 Trade交易的Model设计
- 3-5 用户操作的Model设计
- 3-6 migrations原理及表生成
- 3-7 xadmin后台管理系统的配置
- 3-8 导入商品类别数据
- 3-9 导入商品和商品类别数据
- 4-1 restful API介绍
- 4-2 Vue的基本概念介绍
- 4-3 Vue源码结构介绍
- 5-1 Django的view实现商品列表页
- 5-2 Django的serializer序列化model
- 5-3 apiview方式实现商品列表页-1
- 5-4 apiview实现商品列表页-2
- 5-5 drf的modelserial实现商品列表页功能
- 5-6 GenericView方式实现商品列表页和分页功能介绍
- 5-7 viewsets和router完成商品列表项
- 5-8 drf的Apiview、GenericView、Viewset和Router的原理分析
- 5-9 drf的request和response
- 5-10 drf的过滤
- 5-11 drf的搜索和排序
- 5-12 总结
- 6-1 商品列表数据接口-1
- 6-2 商品类别数据接口-2
- 6-3 Vue展示商品分类数据
- 6-4 Vue展示商品列表页数据-1
- 6-5 Vue展示商品列表页数据-2
- 6-6 Vue的商品搜索功能
- 7-1 drf的token登录和原理-1
- 7-2 drf的token登录和原理-2
- 7-3 viewsets配置认证类
- 7-4 json web token的原理
- 7-5 json web token方式完成用户认证
- 7-6 Vue和jwt接口调试
- 7-7 云片网发送短信验证码
- 7-8 drf实现发送短信验证码接口-1
- 7-9 drf实现发送短信验证码接口-2
- 7-10 user serializer和validator验证一1
- 7-11 user serializer和validator验证-2
- 7-12 Django的信号量实现用户密码修改;
- 7-13 Vue和注册功能联调
- 8-1 viewsets实现商品详情页接口
- 8-2 热卖商品接口实现
- 8-3 用户收藏接口实现
- 8-4 drf的权限验证
- 8-5 用户收藏功能和Vue联调
- 9-1 drf的api文档自动生成和功能详解
- 9-2 动态设置serializer和permission获取用户信息
- 9-3 Vue和用户接口信息联调
- 9-4 用户个人信息修改
- 9-5 用户收藏功能
- 9-6 用户留言功能
- 9-7 用户收货地址列表页接口开发
- 9-8 Vue和收货地址接口联调
- 10-1 购物车功能需求分析和加入到购物车实现
- 10-2 修改购物车数量
- 10-3 Vue和购物车接口联调
- 10-4 订单管理接口-1
- 10-5 订单管理接口-2
- 10-6 Vue个人中心订单接口调试
- 10-7 Pycharm远程代码调试-1
- 10-8 Pycharm远程代码调试-2
- 10-9 支付宝公钥、私钥和沙箱环境配置
- 10-10 支付宝开发文档解读
- 10-11 支付宝支付源码解读
- 10-12 支付宝通知接口验证
- 10-13 Django集成支付宝notify_url和return_url接口-1
- 10-14 Django集成支付宝notify_url和return_url接口-2
- 10-15 支付宝接口和Vue联调-1
- 10-16 支付宝接口和Vue联调-2
- 11-1 轮播图接口实现和Vue调试
- 11-2 新品功能接口开发
- 11-3 首页商品分类显示功能-1
- 11-4 首页商品分类显示功能-2
- 11-5 商品点击数、收藏数修改
- 11-6 商品库存和销量修改
- 11-7 drf的缓存设置
- 11-8 drf配置Redis缓存
- 11-9 drf的throttle设置api的访问速率
- 12-1 第三方登录开发模式以及oauth2.0简介
- 12-2 oauth2.0获取微博的access_token
- 12-3 social_django集成第三方登录-1
- 12-4 social_django集成第三方登录-2
- 13-1 sentry的介绍和通过docker搭建sentry
- 13-2 sentry的功能
- 13-3 sentry集成到django rest framework中-1
- 13-4 sentry集成到django rest framework中-2
1-1 课程导学
1.1.1 掌握的技术;
- Vue + Django REST framework前后端分离的技术;
- 彻底玩转restful api开发流程;
- Django REST framework的功能实现和核心源代码分析;
- Sentry完成线上系统的错误日志的监控和告警;
- 第三方登录和支付宝支付的集成;
- 本地调试远程服务器代码的技巧;
1.1.2 看课程
2-1 Pycharm的安装和简单使用
2-2 MySQL和Navicat的安装和使用1
2-3 Windows和Linux下安装Python2和Python3
2.3.1 Python2.x和Python3.x的安装;
2-4 虚拟环境的安装和配置
2.4.1 Virtualenv和virtualenvwrapper工具创建开发环境;
2-5 Vue开发环境搭建
2.5.1 前端开发IDE神器-WebStorm;
2.5.3 Node.js的安装,使用内部的npm;
2.5.4 cnpm淘宝镜像的使用;
2-6 资源获取方式和提问方式
2.6.1 慕课网;
2.6.3 coding和码云;
2.6.4 提问问题方式;
3-1 项目初始化
3.1.1 DjangoREST framework是基于 Django开发的用于 API开发的框架;
django-rest-framework,是一套基于Django 的 REST 框架,是一个强大灵活的构建 Web API 的工具包。
3.1.2 DjangoRESTframework依赖Django;
官方文档:http://www.django-rest-framework.org/
pip install djangorestframework
pip install markdown
pip install django-filter
3.1.3 settings.py中修改数据库指向为为MySQL;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'MxShop',
'USER': 'root',
'PASSWORD': 'Tqtl911!@#)^',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {'init_command': 'SET default_storage_engine =INNODB;'},
}
}
3.1.4 pip3 install mysqlclient 代替python-mysql;
报错信息:
'Did you install mysqlclient or MySQL-python?' % e django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'. Did you install mysqlclient or MySQL-python?
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/v_/mm78zg6d68j30vn2f3wq3ck40000gn/T/pip-install-0m9q5pa9/mysqlclient/
解决步骤:
- 尝试安装mysqlclient,pip3 install mysqlclient
- 安装pymysql;
- 在__init__.py中添加两行;
import pymysql pymysql.install_as_MySQLdb()
3-2 User Model设计
3.2.1 创建users、goods、trade、user_operation等app,并移动至apps目录下;
3.2.2 进行users.models.py的设计;
3.2.3 settings.py中配置AUTH_USER_MODEL来替代Django本身的AUTH属性;
users.models.py;
from datetime import datetime from django.db import models # Create your models here. from django.contrib.auth.models import AbstractUser class UserProfile(AbstractUser): """ 用户 """ name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名") birthday = models.DateField(null=True, blank=True, verbose_name="出生年月") gender = models.CharField(max_length=6, choices=(("male", u"男"), ("female", u"女")), default="female", verbose_name="性别") mobile = models.CharField(max_length=11, verbose_name="电话") email = models.EmailField(max_length=100, null=True, blank=True, verbose_name="邮箱") class Meta: verbose_name = "用户" verbose_name_plural = verbose_name def __str__(self): return self.name class VerifyCode(models.Model): """ 短信验证码 """ code = models.CharField(max_length=10, verbose_name="验证码") mobile = models.CharField(max_length=11, verbose_name="电话") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "短信验证码" verbose_name_plural = verbose_name def __str__(self): return self.code
3-3 Goods Model设计
3.3.1 goods Model的设计;
goods/models.py;
from datetime import datetime from django.db import models from DjangoUeditor.models import UEditorField # Create your models here. class GoodsCategory(models.Model): """ 商品类别 """ CATEGORY_TYPE = ( (1, "一级类目"), (2, "二级类目"), (3, "三级类目"), ) name = models.CharField(default="", max_length=30, verbose_name="类别名", help_text="类别名") code = models.CharField(default="", max_length=30, verbose_name="类别code", help_text="类别code") desc = models.TextField(default="", verbose_name="类别描述", help_text="类别描述") category_type = models.IntegerField(choices=CATEGORY_TYPE, verbose_name="类目级别", help_text="类目级别") parent_category = models.ForeignKey("self", null=True, blank=True, verbose_name="父类别", related_name="sub_cat") is_tab = models.BooleanField(default=False, verbose_name="是否导航", help_text="是否导航") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "商品类别" verbose_name_plural = verbose_name def __str__(self): return self.name class GoodesCategoryBrand(models.Model): """ 品牌名 """ name = models.CharField(default="", max_length=30, verbose_name="品牌名", help_text="品牌名") desc = models.TextField(default="", max_length=200, verbose_name="品牌描述", help_text="品牌描述") image = models.ImageField(max_length=200, upload_to="brand/images/") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "品牌" verbose_name_plural = verbose_name def __str__(self): return self.name class Goods(models.Model): """ 商品 """ category = models.ForeignKey(GoodsCategory, verbose_name="商品类目") goods_sn = models.CharField(max_length=50, default="", verbose_name="商品唯一货号") name = models.CharField(max_length=300, default="", verbose_name="商品名") click_name = models.IntegerField(default=0, verbose_name="点击数") sold_num = models.IntegerField(default=0, verbose_name="商品销售数量") fav_num = models.IntegerField(default=0, verbose_name="收藏数") goods_num = models.IntegerField(default=0, verbose_name="库存数") market_price = models.FloatField(default=0, verbose_name="市场价格") shop_price = models.FloatField(default=0, verbose_name="本店价格") goods_brief = models.TextField(max_length=500, verbose_name="商品简短描述") goods_desc = UEditorField(verbose_name=u"内容", imagePath="goods/images/", width=1000, height=300, filePath="goods/files/", default='') ship_free = models.BooleanField(default=True, verbose_name="是否承担运费") goods_front_image = models.ImageField(upload_to="", null=True, blank=True, verbose_name="商品封面图") is_new = models.BooleanField(default=False, verbose_name="是否新品") is_hot = models.BooleanField(default=False, verbose_name="是否热销") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "商品" verbose_name_plural = verbose_name def __str__(self): return self.name class GoodsImage(models.Model): """ 商品轮播图 """ goods = models.ForeignKey(Goods, verbose_name="商品", related_name="images") image = models.ImageField(upload_to="", verbose_name="图片", null=True, blank=True) image_url = models.CharField(max_length=300, null=True, blank=True, verbose_name="图片URL") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "商品轮播图" verbose_name_plural = verbose_name def __str__(self): return self.goods.name class Banner(models.Model): """ 轮播的商品 """ goods = models.ForeignKey(Goods, verbose_name="商品") image = models.ImageField(upload_to="banner", verbose_name="轮播图片") index = models.IntegerField(default=0, verbose_name="轮播顺序") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "轮播商品" verbose_name_plural = verbose_name def __str__(self): return self.goods.name
3-4 Trade交易的Model设计
3.4.1 购物车和订单的概念;
trade/models.py设计;
from datetime import datetime from django.db import models from django.contrib.auth import get_user_model from goods.models import Goods User = get_user_model() # Create your models here. class ShoppingCart(models.Model): """ 购物车 """ user = models.ForeignKey(User, verbose_name=u"用户") goods = models.ForeignKey(Goods, verbose_name=u"商品") nums = models.IntegerField(default=0, verbose_name=u"购买数量") add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") class Meta: verbose_name = "购物车" verbose_name_plural = verbose_name def __str__(self): return "%s(%d)".format(self.goods.name, self.goods_num) class OrderInfo(models.Model): """ 订单 """ ORDER_STATUS = ( ("sucess", "成功"), ("cancel", "取消"), ("cancel", "待支付"), ) # PAY_TYPE = ( # ("alipay", "支付宝"), # ("wechat", "微信"), # ) user = models.ForeignKey(User, verbose_name=u"用户") order_sn = models.CharField(max_length=30, unique=True, verbose_name="订单号") trade_no = models.CharField(max_length=50, unique=True, null=True, blank=True, verbose_name=u"交易号") pay_status = models.CharField(choices=ORDER_STATUS, max_length=10, verbose_name="订单状态") post_script = models.CharField(max_length=200, verbose_name="订单留言") order_mount = models.FloatField(default=0.0, verbose_name="订单金额") pay_time = models.DateTimeField(null=True, blank=True, verbose_name="支付时间") # 用户信息 address = models.CharField(max_length=100, default="", verbose_name="收货地址") signer_name = models.CharField(max_length=20, default="", verbose_name="签收人") signer_mobile = models.CharField(max_length=11, verbose_name="联系电话") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "订单" verbose_name_plural = verbose_name def __str__(self): return str(self.order_sn) class OrderGoods(models.Model): """ 订单的商品详情 """ order = models.ForeignKey(OrderInfo, verbose_name="订单信息") goods = models.ForeignKey(Goods, verbose_name="商品") goods_num = models.IntegerField(default=0, verbose_name="商品数量") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "订单商品" verbose_name_plural = verbose_name def __str__(self): return str(self.order.order_sn)
3-5 用户操作的Model设计
3.5.1 user_opration下的models.py设计;
from datetime import datetime from django.db import models from django.contrib.auth import get_user_model from goods.models import Goods User = get_user_model() # Create your models here. class UserFav(models.Model): """ 用户收藏 """ user = models.ForeignKey(User, verbose_name="用户") goods = models.ForeignKey(Goods, verbose_name="商品") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "用户收藏" verbose_name_plural = verbose_name def __str__(self): return self.user.name class UserLeavingMessage(models.Model): """ 用户留言 """ MESSAGE_CHOICES = ( (1, "留言"), (2, "投诉"), (3, "询问"), (4, "售后"), (5, "求购"), ) user = models.ForeignKey(User, verbose_name="用户") message_type = models.IntegerField(default=1, choices=MESSAGE_CHOICES, verbose_name="", help_text="留言类型:1(留言),2(投诉),3(询问),4(售后),5(求购)") subject = models.CharField(max_length=100, default="", verbose_name="主题") message = models.TextField(default="", verbose_name="留言内容", help_text="留言内容") file = models.FileField(verbose_name="上传的文件", help_text="上传的文件") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "用户留言" verbose_name_plural = verbose_name def __str__(self): return self.subject class UserAddress(models.Model): """ 用户收货地址 """ user = models.ForeignKey(User, verbose_name="用户") address = models.CharField(max_length=100, default="", verbose_name="区域") signer_name = models.CharField(max_length=100, default="", verbose_name="签收人") signer_mobile = models.CharField(max_length=11, default="", verbose_name="电话") add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta: verbose_name = "收货地址" verbose_name_plural = verbose_name def __str__(self): return self.address
3-6 migrations原理及表生成
3.6.1 settings.py中配置了AUTH_USER_MODEL = 'users.UserProfile'就不会再生成auth_user表;
3.6.2 如果migrate不生效,可删除django_migrations中的部分表;
3.6.3 通过Navvicat 与migrations不建议混用;
3-7 xadmin后台管理系统的配置
3.7.1 xadmin的配置settings.py中添加两项:xadmin、crispy_forms并在各个app中添加xadmin.py文件;
3.7.2 安装xadmin的依赖包文件;
地址如下:https://github.com/sshwsfc/xadmin/blob/master/requirements.txt
- pip3 install xlwt xlsxwriter
3.7.3 改为中文显示;
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False
3-8 导入商品类别数据
3.8.1 category_data.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#!/usr/bin/env python # encoding: utf-8 row_data = [ { 'sub_categorys': [ { 'sub_categorys': [ { 'code': 'yr', 'name': '羊肉' }, { 'code': 'ql', 'name': '禽类' }, { 'code': 'zr', 'name': '猪肉' }, { 'code': 'nr', 'name': '牛肉' } ], 'code': 'jprl', 'name': '精品肉类' }, { 'sub_categorys': [ { 'code': 'cb', 'name': '参鲍' }, { 'code': 'yu', 'name': '鱼' }, { 'code': 'xia', 'name': '虾' }, { 'code': 'xb', 'name': '蟹/贝' } ], 'code': 'hxsc', 'name': '海鲜水产' }, { 'sub_categorys': [ { 'code': 'xhd_xyd', 'name': '松花蛋/咸鸭蛋' }, { 'code': 'jd', 'name': '鸡蛋' } ], 'code': 'dzp', 'name': '蛋制品' }, { 'sub_categorys': [ { 'code': 'sc', 'name': '生菜' }, { 'code': 'bc', 'name': '菠菜' }, { 'code': 'yj', 'name': '圆椒' }, { 'code': 'xlh', 'name': '西兰花' } ], 'code': 'ycl', 'name': '叶菜类' }, { 'sub_categorys': [ ], 'code'