一、环境搭建
1.安装Python:去Python官网下载最新版本Python进行安装,安装时记得勾选将Python加入系统环境变量
2.在命令行输入pip install virtualenv
3.在指定目录安装虚拟环境:在命令行输入virtualenv venv(虚拟环境名)
4.打开Pycharm创建Django项目
二、认识电商
2.1 B2B-企业对企业
B2B ( Business to Business)是指进行电子商务交易的供需双方都是商家(或企业、 公司),她(他)们使用了互联网的技术或各种商务网络平台,完成商务交易的过程。电子商务是现代 B2B marketing 的一种具体主要的表现形式。
案例:阿里巴巴
2.2 C2C-个人对个人
C2C 即 Customer(Consumer) to Customer(Consumer),意思就是消费者个人间的电子商务行为。比如一个消费者有一台电脑,通过网络进行交易,把它出售给另外一个 消费者,此种交易类型就称为 C2C 电子商务。
案例:淘宝、瓜子二手车
2.3 B2C-企业对个人
B2C 是 Business-to-Customer 的缩写,而其中文简称为“商对客”。“商对客”是电子商务的一种模式,也就是通常说的直接面向消费者销售产品和服务商业零售模式。这种形式的电子商务一般以网络零售业为主,主要借助于互联网开展在线销售活动。B2C 即企业通过互联网为消费者提供一个新型的购物环境——网上商店,消费者通过网络在网上购物、网上支付等消费行为。
案例:唯品会
2.4 C2B-个人对企业
C2B(Consumer to Business,即消费者到企业),是互联网经济时代新的商业模式。 这一模式改变了原有生产者(企业和机构)和消费者的关系,是一种消费者贡献价值(Create Value), 企业和机构消费价值(Consume Value)。
C2B 模式和我们熟知的供需模式(DSM, Demand Supply Model)恰恰相反,真正的 C2B 应该先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产企业按需求组织生产。通常情况为消费者根据自身需求定制产品和价格,或主动参与产品设计、生产和定价,产品、价格等彰显消费者的个性化需求,生产企业进行定制化生产。
案例:海尔商城
2.5 O2O-线上到线下
O2O 即 Online To Offline(在线离线/线上到线下),是指将线下的商务机会与互联网结合,让互联网成为线下交易的平台,这个概念最早来源于美国。O2O 的概念非常广泛, 既可涉及到线上,又可涉及到线下,可以通称为O2O。
案例:美团、饿了么
2.6 F2C-工厂到个人
F2C 指的是 Factory to customer,即从厂商到消费者的电子商务模式。
2.7 B2B2C-企业-企业-个人
B2B2C 是一种电子商务类型的网络购物商业模式,B 是BUSINESS的简称,C 是CUSTOMER的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子商务的企业,C 则是表示消费者。
第一个 BUSINESS,并不仅仅局限于品牌供应商、影视制作公司和图书出版商,任何的商品供应商或服务供应商都能可以成为第一个 BUSINESS;第二B是B2B2C模式的电子商务 企业,通过统一的经营管理对商品和服务、消费者终端同时进行整合,是广大供应商和消费者之间的桥梁,为供应商和消费者提供优质的服务,是互联网电子商务服务供应商。C表示消费者,在第二个 B 构建的统一电子商务平台购物的消费者;
B2B2C 的来源于目前的 B2B、B2C 模式的演变和完善,把B2C和C2C完美地结合起来,通过 B2B2C 模式的电子商务企业构建自己的物流供应链系统,提供统一的服务。
案例:京东商城
总结:我们此次开发的项目是B2C类型的商城
三、项目流程
四、需求分析
3.1 用户模块
1. 注册页
* 注册时校验用户名是否已被注册。
* 完成用户信息的注册。
* 给用户的注册邮箱发送邮件,用户点击邮件中的激活链接完成用户账户的激活。
2. 登录页
* 实现用户的登录功能。
3. 用户中心
* 用户中心信息页:显示登录用户的信息,包括用户名、电话和地址,同时页面下方显示出用户最近浏览的商品信息。
* 用户中心地址页:显示登录用户的默认收件地址,页面下方的表单可以新增用户的收货地址。
* 用户中心订单页:显示登录用户的订单信息。
4. 其他
* 如果用户已经登录,页面顶部显示登录用户的信息。
3.2 商品相关
1.首页
* 动态指定首页轮播商品信息。
* 动态指定首页活动信息。
* 动态获取商品的种类信息并显示。
* 动态指定首页显示的每个种类的商品(包括图片商品和文字商品)。
* 点击某一个商品时跳转到商品的详情页面。
2.商品详情页
* 显示出某个商品的详情信息。
* 页面的左下方显示出该种类商品的2个新品信息。
3.商品列表页
* 显示出某一个种类商品的列表数据,分页显示并支持按照默认、价格、和人气进行排序。
* 页面的左下方显示出该种类商品的2个新品信息。
4.其他
* 通过页面搜索框搜索商品信息。
3.3 购物车相关
* 列表页和详情页将商品添加到购物车。
* 用户登录后,首页,详情页,列表页显示登录用户购物车中商品的数目。
* 购物车页面:对用户购物车中商品的操作。如选择某件商品,增加或减少购物车中商品的数目。
3.4 订单相关
* 提交订单页面:显示用户准备购买的商品信息。
* 点击提交订单完成订单的创建。
* 用户中心订单页显示用户的订单信息。
* 点击支付完成订单的支付。
五、架构设计
六、数据库设计
6.1认识SKU和SPU概念
SPU 是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述 了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个 SPU。SPU是一个抽象的概念。
SKU 是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。 在服装、鞋类商品中使用最多最普遍。SKU是一个具体的商品。
案例:iphone7是一个SPU,选择了颜色、款式、套餐的iphone7就是一个SKU
七、模型类设计
设计好数据库后,在各个模块的models.py文件中添加模型类代码:
7.1用户模块:
class User(AbstractUser,BaseModel): 继承Django提供的用户基类
'''用户模型类'''
class Meta:
db_table = 'df_user'
verbose_name = '用户'
verbose_name_plural = verbose_name
class Address(BaseModel):
'''地址模型类'''
user = models.ForeignKey('User', verbose_name='所属账户') 外键关联用户表
receiver = models.CharField(max_length=20, verbose_name='收件人')
addr = models.CharField(max_length=256, verbose_name='收件地址')
zip_code = models.CharField(max_length=6, null=True, verbose_name='邮政编码')
phone = models.CharField(max_length=11, verbose_name='联系电话')
is_default = models.BooleanField(default=False, verbose_name='是否默认')
class Meta:
db_table = 'df_address'
verbose_name = '地址'
verbose_name_plural = verbose_name
7.2商品模块:
class GoodsType(BaseModel):
'''商品类型模型类'''
name = models.CharField(max_length=20, verbose_name='种类名称')
logo = models.CharField(max_length=20, verbose_name='标识')
image = models.ImageField(upload_to='type', verbose_name='商品类型图片')
class Meta:
db_table = 'df_goods_type'
verbose_name = '商品种类'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class GoodsSKU(BaseModel):
'''商品SKU模型类'''
status_choices = (
(0, '下线'),
(1, '上线'),
)
type = models.ForeignKey('GoodsType', verbose_name='商品种类')关联商品种类表
goods = models.ForeignKey('Goods', verbose_name='商品SPU')关联商品SPU表
name = models.CharField(max_length=20, verbose_name='商品名称')
desc = models.CharField(max_length=256, verbose_name='商品简介')
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格') 十进制数字,取小数点后两位数
unite = models.CharField(max_length=20, verbose_name='商品单位')
image = models.ImageField(upload_to='goods', verbose_name='商品图片')
stock = models.IntegerField(default=1, verbose_name='商品库存')
sales = models.IntegerField(default=0, verbose_name='商品销量')
status = models.SmallIntegerField(default=1, choices=status_choices, verbose_name='商品状态')
class Meta:
db_table = 'df_goods_sku'
verbose_name = '商品'
verbose_name_plural = verbose_name
class Goods(BaseModel):
'''商品SPU模型类'''
name = models.CharField(max_length=20, verbose_name='商品SPU名称')
# 富文本类型:带有格式的文本
detail = HTMLField(blank=True, verbose_name='商品详情')
class Meta:
db_table = 'df_goods'
verbose_name = '商品SPU'
verbose_name_plural = verbose_name
class GoodsImage(BaseModel):
'''商品图片模型类'''
sku = models.ForeignKey('GoodsSKU', verbose_name='商品')关联商品SKU表
image = models.ImageField(upload_to='goods', verbose_name='图片路径')
class Meta:
db_table = 'df_goods_image'
verbose_name = '商品图片'
verbose_name_plural = verbose_name
7.3订单模块:
class OrderInfo(BaseModel):
'''订单模型类'''
PAY_METHOD_CHOICES = (
(1, '货到付款'),
(2, '微信支付'),
(3, '支付宝'),
(4, '银联支付')
)
ORDER_STATUS_CHOICES = (
(1, '待支付'),
(2, '待发货'),
(3, '待收货'),
(4, '待评价'),
(5, '已完成')
)
order_id = models.CharField(max_length=128, primary_key=True, verbose_name='订单id')
user = models.ForeignKey('user.User', verbose_name='用户')关联用户表
addr = models.ForeignKey('user.Address', verbose_name='地址')关联地址表
pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=3, verbose_name='支付方式')
total_count = models.IntegerField(default=1, verbose_name='商品数量')
total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品总价')
transit_price = models.DecimalField(max_digits=10, decimal_places=2,verbose_name='订单运费')
order_status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name='订单状态')
trade_no = models.CharField(max_length=128, verbose_name='支付编号')
class Meta:
db_table = 'df_order_info'
verbose_name = '订单'
verbose_name_plural = verbose_name
class OrderGoods(BaseModel):
'''订单商品模型类'''
order = models.ForeignKey('OrderInfo', verbose_name='订单')关联订单表
sku = models.ForeignKey('goods.GoodsSKU', verbose_name='商品SKU')关联商品SKU表
count = models.IntegerField(default=1, verbose_name='商品数目')
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
comment = models.CharField(max_length=256, verbose_name='评论')
class Meta:
db_table = 'df_order_goods'
verbose_name = '订单商品'
verbose_name_plural = verbose_name
7.4 BaseModel模块是公共模块,包含以下参数:
class BaseModel(models.Model):
'''模型抽象基类'''
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
is_delete = models.BooleanField(default=False, verbose_name='删除标记')
class Meta:
# 说明是一个抽象模型类
abstract = True
7.5 富文本的使用方法:
7.5.1在虚拟环境中安装包:
pip install django-tinymce==2.6.0
7.5.2在app/settings.py中为INSTALLED_APPS添加编辑器应用:
INSTALLED_APPS = (
...
'tinymce',
)
7.5.3在app/settings.py中添加编辑器配置:
TINYMCE_DEFAULT_CONFIG = {
'theme': 'advanced',
'width': 600,
'height': 400,
}
7.5.4在app/urls.py中配置编辑器url:
urlpatterns = [
...
url(r'^tinymce/', include('tinymce.urls')),
]
7.5.5在booktest/models.py中,定义模型的属性为HTMLField()类型:
from django.db import models
from tinymce.models import HTMLField
class GoodsInfo(models.Model):
gcontent=HTMLField()
7.5.6数据迁移:
python manage.py makemigrations
python manage.py migrate
7.5.7在booktest/admin.py中注册模型类GoodsInfo:
from django.contrib import admin
from booktest.models import *
class GoodsInfoAdmin(admin.ModelAdmin):
list_display = ['id']
admin.site.register(GoodsInfo,GoodsInfoAdmin)
7.5.8运行服务器,进入admin后台管理,点击GoodsInfo的添加。