020、网上商城项目开发流程

一、项目介绍

1、项目主要模块

为了方便项目管理及多人协同开发,我们根据需求将功能划分为不同的模块。

将来在项目中,每个模块都会对应一个子应用进行管理和解耦。

模块

功能

验证

图形验证、短信验证

用户

注册、登录、用户中心

第三方登录

QQ登录

首页广告

首页广告

商品

商品列表、商品搜索、商品详情

购物车

购物车管理、购物车合并

订单

确认订单、提交订单

支付

支付宝支付、订单商品评价

MIS系统

数据统计、用户管理、权限管理、商品管理、订单管理

2、项目开发模式

选项

技术选型

开发模式

前后端不分离

后端框架

Django + Jinja2模板引擎

前端框架

Vue.js

说明:

  • 前后端不分离的开发模式,是为了提高搜索引擎排名,即SEO。特别是首页,详情页和列表页。
  • 页面需要整体刷新:我们会选择使用Jinja2模板引擎来实现。
  • 页面需要局部刷新:我们会选择使用Vue.js来实现。

3. 知识要点

  1. 项目开发模式
    • 前后端不分离,方便SEO。
    • 采用Django + Jinja2模板引擎 + Vue.js实现前后端逻辑。
  1. 项目运行机制
    • 代理服务:Nginx服务器(反向代理)
    • 静态服务:Nginx服务器(静态首页、商品详情页、...)
    • 动态服务:uwsgi服务器(美多商场业务场景)
    • 后端服务:MySQL、Redis、Celery、RabbitMQ、Docker、FastDFS、Elasticsearch、Crontab
    • 外部接口:容联云、QQ互联、支付宝

二、创建工程

美多商城项目源代码采用远程仓库托管。

1、准备项目代码仓库

1.源码托管网站

2.创建源码远程仓库:meiduo_project

2. 克隆项目代码仓库

1.进入本地项目目录

$ cd ~/Desktop

2.克隆仓库

$ git clone 项目地址

3. 创建商城工程

1.进入本地项目仓库

$ cd meiduo_project

2.创建美多商城虚拟环境,安装Django框架

$ mkvirtualenv -p python3 meiduo_mall

$ pip install django==1.11.11

3.创建美多商城Django工程

$ django-admin startproject meiduo_mall

创建工程完成后:运行程序,测试结果。

三、配置开发环境

美多商城项目的环境分为开发环境和生产环境。

开发环境:用于编写和调试项目代码。

生产环境:用于项目线上部署运行。

1. 新建配置文件

  1. 准备配置文件目录
  • 新建包,命名为settings,作为配置文件目录
  1. 准备开发和生产环境配置文件
  • 在配置包settings中,新建开发和生产环境配置文件
  1. 准备开发环境配置内容
  • 将默认的配置文件settings.py中内容拷贝至dev.py

注意:配置完成后:运行程序,测试结果。

2、配置Jinja2模板引擎

美多商城的模板采用Jinja2模板引擎。

1. 安装Jinja2扩展包

$ pip install Jinja2

2. 配置Jinja2模板引擎

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',  # jinja2模板引擎
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

3. 补充Jinja2模板引擎环境

1.创建Jinja2模板引擎环境配置文件

cd meiduo_mall

新建 utils 工具包,并在工具包中新建 jinja2_env.py 文件

2.编写Jinja2模板引擎环境配置代码

from jinja2 import Environment
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse


def jinja2_environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    return env


"""
确保可以使用模板引擎中的{{ url('') }} {{ static('') }}这类语句 
"""

3.加载Jinja2模板引擎环境

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',  # jinja2模板引擎
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            # 补充Jinja2模板引擎环境
            'environment': 'meiduo_mall.utils.jinja2_env.jinja2_environment', 
        },
    },
]

配置完成后:运行程序,测试结果。

3、配置MySQL数据库

美多商城数据存储服务采用MySQL数据库。

1. 新建MySQL数据库

1.新建MySQL数据库:meiduo_mall

$ create database meiduo charset=utf8;

2.新建MySQL用户

$ create user itheima identified by '123456';

3.授权itcast用户访问meiduo_mall数据库

$ grant all on meiduo.* to 'itheima'@'%';

4.授权结束后刷新特权

$ flush privileges;

2. 配置MySQL数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 数据库引擎
        'HOST': '127.0.0.1', # 数据库主机
        'PORT': 3306, # 数据库端口
        'USER': 'itheima', # 数据库用户名
        'PASSWORD': '123456', # 数据库用户密码
        'NAME': 'meiduo' # 数据库名字
    },
}

可能出现的错误

  • Error loading MySQLdb module: No module named 'MySQLdb'.

出现错误的原因:

  • Django中操作MySQL数据库需要驱动程序MySQLdb
  • 目前项目虚拟环境中没有驱动程序MySQLdb

解决办法:

  • 安装PyMySQL扩展包
  • 因为MySQLdb只适用于Python2.x的版本,Python3.x的版本中使用PyMySQL替代MySQLdb

3. 安装PyMySQL扩展包

1.安装驱动程序

$ pip install PyMySQL

2.在工程同名子目录的__init__.py文件中,添加如下代码:

from pymysql import install_as_MySQLdb

install_as_MySQLdb()

配置完成后:运行程序,测试结果。

4、配置Redis数据库

美多商城数据缓存服务采用Redis数据库。

1. 安装django-redis扩展包

1.安装django-redis扩展包

$ pip install django-redis

2.django-redis使用说明文档

点击进入文档

2. 配置Redis数据库

CACHES = {
    "default": { # 默认
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "session": { # session
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

default:

  • 默认的Redis配置项,采用0号Redis库。

session:

  • 状态保持的Redis配置项,采用1号Redis库。

SESSION_ENGINE

  • 修改session存储机制使用Redis保存。

SESSION_CACHE_ALIAS:

  • 使用名为"session"的Redis配置项存储session数据。

配置完成后:运行程序,测试结果。

5、配置工程日志

美多商城的日志记录采用logging模块。

1. 配置工程日志

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # 是否禁用已经存在的日志器
    'formatters': {  # 日志信息显示的格式
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {  # 对日志进行过滤
        'require_debug_true': {  # django在debug模式下才输出日志
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {  # 日志处理方法
        'console': {  # 向终端中输出日志
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {  # 向文件中输出日志
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(os.path.dirname(BASE_DIR), 'logs/meiduo.log'),  # 日志文件的位置
            'maxBytes': 300 * 1024 * 1024,
            'backupCount': 10,
            'formatter': 'verbose'
        },
    },
    'loggers': {  # 日志器
        'django': {  # 定义了一个名为django的日志器
            'handlers': ['console', 'file'],  # 可以同时向终端与文件中输出日志
            'propagate': True,  # 是否继续传递日志信息
            'level': 'INFO',  # 日志器接收的最低日志级别
        },
    }
}

2. 准备日志文件目录

新建logs文件夹

3. 日志记录器的使用

import logging

# 创建日志记录器
logger = logging.getLogger('django')
# 输出日志
logger.debug('测试logging模块debug')
logger.info('测试logging模块info')
logger.error('测试logging模块error')

4. Git管理工程日志

提示1:

  • 开发过程中,产生的日志信息不需要代码仓库进行管理和记录。

提示2:

  • 建立代码仓库时,生成的忽略文件中已经默认忽略掉了 *.log 。

问题:

  • logs文件目录需求被Git仓库记录和管理。
  • 当把 *.log 都忽略掉后,logs文件目录为空。
  • 但是,Git是不允许提交一个空的目录到版本库上的。

解决:

  • 在空文件目录中建立一个 .gitkeep 文件,然后即可提交。

配置完成后:运行程序,测试结果。

5. 知识要点

  1. 本项目最低日志等级设置为:INFO
  2. 创建日志记录器的方式:

logger = logging.getLogger('django')

  1. 日志记录器的使用:

logger.info('测试logging模块info')

  1. 在日志loggers选项中可以指定多个日志记录器

6、配置前端静态文件

美多商城项目中需要使用静态文件,比如 css、images、js 等等。

1. 准备静态文件

2. 指定setting中静态文件加载路径

STATIC_URL = '/static/'

# 配置静态文件加载路径

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

配置完成后:运行程序,测试结果。

四、创建模块子应用

1. 创建用户模块子应用

1.准备apps包,用于管理所有应用

2.在apps包下创建应用users

$ cd ~/projects/meiduo_project/meiduo_mall/meiduo_mall/apps

$ python ../../manage.py startapp users

已知导包路径

  • meiduo_project/meiduo_mall

已知 'users'应用所在目录

  • meiduo_project/meiduo_mall/meiduo_mall/apps/users

得到导入'users'应用的导包路径是:meiduo_mall/apps/users

3. setting中注册用户模块子应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'meiduo_mall.apps.users', # 用户模块应用
]

注册完users应用后,运行测试程序。

2、追加导包路径

1.查看项目BASE_DIR

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

2.追加导包路径

import os,sys sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

2. 重新注册用户模块应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'users', # 用户模块应用
]

重新注册完users应用后,运行测试程序。

3、展示用户注册页面

1. 准备用户注册模板文件

2. 定义用户注册视图

class RegisterView(View):
    """用户注册"""

    def get(self, request):
        """
        提供注册界面
        :param request: 请求对象
        :return: 注册界面
        """
        return render(request, 'register.html')

3. 定义用户注册路由

1.总路由

urlpatterns = [  url(r'^', include('users.urls', namespace='users')), ]

2.子路由

urlpatterns = [ url(r'^register/$', views.RegisterView.as_view(), name='register'), ]

4、定义用户模型类

1. Django默认用户认证系统

  • Django自带用户认证系统
    • 它处理用户账号、组、权限以及基于cookie的用户会话。
  • Django认证系统位置
    • django.contrib.auth包含认证框架的核心和默认的模型。
    • django.contrib.contenttypes是Django内容类型系统,它允许权限与你创建的模型关联。
  • Django认证系统同时处理认证和授权
    • 认证:验证一个用户是否它声称的那个人,可用于账号登录。
    • 授权:授权决定一个通过了认证的用户被允许做什么。
  • Django认证系统包含的内容
    • 用户:用户模型类、用户认证。
    • 权限:标识一个用户是否可以做一个特定的任务,MIS系统常用到。
    • 组:对多个具有相同权限的用户进行统一管理,MIS系统常用到。
    • 密码:一个可配置的密码哈希系统,设置密码、密码校验。

2. Django默认用户模型类

  • Django认证系统中提供了用户模型类User保存用户的数据。
    • User对象是认证系统的核心。
  • Django认证系统用户模型类位置
    • django.contrib.auth.models.User
  • 父类AbstractUser介绍
    • User对象基本属性
      • 创建用户(注册用户)必选: username、password
      • 创建用户(注册用户)可选:email、first_name、last_name、last_login、date_joined、is_active 、is_staff、is_superuse
      • 判断用户是否通过认证(是否登录):is_authenticated
    • 创建用户(注册用户)的方法

user = User.objects.create_user(username, email, password, **extra_fields)

    • 用户认证(用户登录)的方法

from django.contrib.auth import authenticate

user = authenticate(username=username, password=password, **kwargs)

    • 处理密码的方法

设置密码:set_password(raw_password)

校验密码:check_password(raw_password)

3. 自定义用户模型类

思考:为什么要自定义用户模型类?

  • 观察注册界面会发现,美多商城注册数据中必选用户mobile信息。
  • 但是Django默认用户模型类中没有mobile字段,所以要自定义用户模型类。

如何自定义用户模型类?

  • 继承自AbstractUser(可通过阅读Django默认用户模型类的源码得知) 。
  • 新增mobile字段。
from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.


class User(AbstractUser):
    """自定义用户模型类"""
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')

    class Meta:
        db_table = 'tb_users'
        verbose_name = '用户'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

5. 知识要点

  1. Django自带用户认证系统,核心就是User对象,并封装了一系列可用的方法和属性。
  2. Django用户认证系统包含了一系列对用户的操作,比如:模型类,认证,权限,分组,密码处理等。
  3. Django用户认证系统中的用户模型类可以自定义,继承自AbstractUser。
  4. Django用户认证系统说明文档

4、接口设计和定义

1. 设计接口基本思路

  • 对于接口的设计,我们要根据具体的业务逻辑,设计出适合业务逻辑的接口。
  • 设计接口的思路:
    • 分析要实现的业务逻辑:
      • 明确在这个业务中涉及到几个相关子业务。
      • 将每个子业务当做一个接口来设计。
    • 分析接口的功能任务,明确接口的访问方式与返回数据:
      • 请求方法(如GET、POST、PUT、DELETE等)。
      • 请求地址。
      • 请求参数(如路径参数、查询字符串、表单、JSON等)。
      • 响应数据(如HTML、JSON等)。

2. 用户注册接口设计

1.请求方式

选项

方案

请求方法

POST

请求地址

/register/

2.请求参数:表单参数

参数名

类型

是否必传

说明

username

string

用户名

password

string

密码

password2

string

确认密码

mobile

string

手机号

sms_code

string

短信验证码

allow

string

是否同意用户协议

3.响应结果:HTML

  • register.html

响应结果

响应内容

注册失败

响应错误提示

注册成功

重定向到首页

3. 用户注册接口定义

1.注册视图

class RegisterView(View):
    """用户注册"""

    def get(self, request):
        """
        提供注册界面
        :param request: 请求对象
        :return: 注册界面
        """
        return render(request, 'register.html')

    def post(self, request):
        """
        实现用户注册
        :param request: 请求对象
        :return: 注册结果
        """
        pass

2.总路由

urlpatterns = [  url(r'^', include('users.urls', namespace='users')), ]

3.子路由

urlpatterns = [ url(r'^register/$', views.RegisterView.as_view(), name='register'), ]

项目源代码

GitHub:https://github.com/dreamStoneLi/meiduo_mall.git

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

limengshi138392

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值