一、环境搭建

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的添加。