项目开发流程;开发模式;项目架构设计;项目创建(码云);开发环境配置;jinja2模板引擎;mysql配置;配置redis数据库;日志工程的配置;静态文件集成;创建用户模块子应用;设置导包路径;展示用户注册页面;用户模型类创建;用户模型类迁移;注册业务分析;注册接口设计;注册前端业务逻辑分析;注册后端业务实现

1,项目开发流程

  • 目的: 知道项目的开发流程即可
  • 图解:
    • 01.meiduomall项目day01学习笔记_redis

2,开发模式

  • 目的: 知道项目的两种开发模式
  • 前后端不分离:
    • 01.meiduomall项目day01学习笔记_mysql_02
  • 前后端分离:
    • 01.meiduomall项目day01学习笔记_git_03

3,项目架构设计

  • 目的: 知道美多商城技术选型

  • 开发模式 前后端不分离
    后端框架 Django + Jinja2模板引擎
    前端框架 Vue.js

4,项目创建(码云)

  • 目的: 可以在gitee上面创建项目, clone到本地管理美多商城项目

  • 操作流程:

    • 1, 登录到码云创建仓库
    • 2, clone仓库到本地
    • 3, 进入到仓库, 创建项目
    • 4, 上传项目到远程仓库
  • 我的操作流程:

    • 1, 登录到码云创建仓库
    • 2.clone仓库到本地 找一个文件夹右键执行 git clone https://gitee.com/arthurhuang123/meiduo.git【项目https地址】
    • 3.自己在这个文件夹中用pycharm创建一个django项目
    • 4.上传项目到远程仓库:
      • git status 命令用于查看在你上次提交之后是否有对文件进行再次修改。
      • git add 命令可将该文件添加到暂存区。git add 项目名/
      • git commit 命令将暂存区内容添加到本地仓库中。git commit -m '创建工程的一些注释信息'
      • git push 命用于从将本地的分支版本上传到远程并合并。
  • 注意点:

    • .gitignore作用: 忽略不需要使用git管理的文件
      • .idea文件夹是pycharm自带的用户个人配置(颜色,字体等)不用上传到仓库!
      • /.idea/文件添加到.gitignore中
      • 执行 vi gitignore
      • 将 .idea/ 添加到文件中
  • 注意点2:

    • 1, 配置仓库的目录, 在pycharm中

      • 01.meiduomall项目day01学习笔记_django_04
    • 2, 使用git进行提交测试

      • 01.meiduomall项目day01学习笔记_redis_05
      • 01.meiduomall项目day01学习笔记_git_06
      • 01.meiduomall项目day01学习笔记_redis_07
      • 01.meiduomall项目day01学习笔记_git_06

5,开发环境配置

  • 目的: 可以配置项目的两套运行环境

  • 操作流程:

    • 1,创建settings包, 创建dev.py(开发环境), 创建prod.py文件(生产环境)

    • 2, 修改启动加载的配置文件,在manage.py中可以进行切换

      •     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meiduo_mall.settings.dev")
        
  • 注意点:

    • 配置manage.py 作为启动文件
      • 01.meiduomall项目day01学习笔记_django_09
      • 01.meiduomall项目day01学习笔记_redis_10

6,jinja2模板引擎

  • 目的: 能够配置jinja2的模板语法

  • 操作流程:

    • 1, 创建templates文件夹

    • 2, 配置相关的模板语法(meiduo_mall/settings/dev.py)

      • TEMPLATES = [
            {
                'BACKEND': 'django.template.backends.jinja2.Jinja2', # 加载jinja2引擎
                'DIRS': [os.path.join(BASE_DIR,'templates')], #模板存储位置
        				...
          	    'OPTIONS': {
                    'environment':'meiduo_mall.utils.my_jinja2.environment', #设置全局的环境变量方法
                     ...
                    ],
                },
            },
        ]
        
    • 3, 配置全局方法(meiduo_mall/utils/my_jinja2.py)

      • from __future__ import absolute_import  # Python 2 only
        
        from django.contrib.staticfiles.storage import staticfiles_storage
        from django.urls import reverse
        
        from jinja2 import Environment
        
        
        def environment(**options):
            env = Environment(**options)
            env.globals.update({
                'static': staticfiles_storage.url, # static方法
                'url': reverse, #url方法
            })
            return env
        

7,mysql配置

  • 目的: 可以参考官方文档, 配置数据库

  • 操作流程:

    • 1, 配置数据库连接信息(meiduo_mall/settings/dev.py)

      • DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'meiduo17',
                'USER': 'root',
                'PASSWORD': '123456',
                'HOST': '127.0.0.1',
                'PORT': '3306',
            }
        }
        
    • 2, 创建数据库(在终端创建即可)

    • 3, 配置pymysql作为驱动(meiduo_mall/init.py)

      • # 配置pymysql作为mysql的驱动
        import pymysql
        pymysql.install_as_MySQLdb()
        

8,配置redis数据库

  • 目的: 参考文档, 配置redis, 用于以后的缓存信息

  • 操作流程:

    • 1, 配置redis存储信息(meiduo_mall/settings/dev.py)

    • # redis配置 (redis功能:处理缓存信息,持续更新...)
      CACHES = {
          "default": {
              "BACKEND": "django_redis.cache.RedisCache",
              "LOCATION": "redis://127.0.0.1:6379/1",
              "OPTIONS": {
                  "CLIENT_CLASS": "django_redis.client.DefaultClient",
              }
          },
          "session": {
              "BACKEND": "django_redis.cache.RedisCache",
              "LOCATION": "redis://127.0.0.1:6379/0",
              "OPTIONS": {
                  "CLIENT_CLASS": "django_redis.client.DefaultClient",
              }
          }
      }
      # session状态保持信息存储位置
      SESSION_ENGINE = "django.contrib.sessions.backends.cache"
      SESSION_CACHE_ALIAS = "session"
      

9,日志工程的配置

  • 目的: 可以配置日志信息, 记录用户的访问行为, 或者程序运行的行为

  • 操作流程:

    • 1, 日志配置(dev.py)

      • # 日志
        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)

10,静态文件集成

  • 目的: 可以将项目中用到的静态文件集成到工程中

  • 操作流程:

    • 1, 配置静态文件存储位置(dev.py)

      • # 配置静态文件资源存储位置的(绝对路径)
        STATICFILES_DIRS = [
             os.path.join(BASE_DIR,'static')
        ]
        

11,创建用户模块子应用

  • 目的: 可以在apps中创建子应用

  • 操作流程:

    • 1, 在meiduo_mall根应用中创建apps包

    • 2, 进入到apps中, 创建users子应用

      • python ../../manage.py startapp users
        

12,设置导包路径

  • 目的: 可以将apps设置为导包路径

  • 操作流程:

    • 1, 导包路径配置(dev.py)

      • # 告诉pycharm apps作为导包路径, 当使用apps中的子应用的时候, 可以不需要写前缀,直接使用子应用名称即可
        import sys
        sys.path.insert(0,os.path.join(BASE_DIR,'apps'))
        # print(sys.path) #导包路径
        
        INSTALLED_APPS = [
            ...
            # 'users', # 展开时候就是下面的形式
            'users.apps.UsersConfig'
        
        ]
        

13,展示用户注册页面

  • 目的: 可以编写类视图,展示注册页面

  • 操作流程:

    • 1, 根路由(urls.py)

      • url(r'^', include('users.urls'))
        
    • 2, 子路由(users/urls.py)

      • from django.conf.urls import url
        from . import views
        urlpatterns = [
            url(r'^register/$',views.RegisterView.as_view())
        ]
        
    • 3, 类视图(users/views.py)

      • from django.shortcuts import render
        from django.views import View
        
        # 1, 注册页面视图
        class RegisterView(View):
            def get(self,request):
                return render(request,'register.html')
        
        
  • 注意点:

    • 需要将register.html移动到templates中

14,用户模型类创建

  • 目的: 可以定义用户模型类, 设置相关的属性

  • 操作流程:

    • 1, 定义模型类(users/models.py)

      • from django.db import models
        from django.contrib.auth.models import AbstractUser
        
        # 1,定义用户模型类
        class User(AbstractUser):
        
            #1, 增加额外的属性
            mobile = models.CharField(verbose_name="手机号",max_length=11,unique=True)
        
            #2, 指定表名信息
            class Meta:
                db_table = "tb_users"
        
        
    • 2, 配置自定义模型类(dev.py)

      • # 设置自定义的认证模型类
        AUTH_USER_MODEL = 'users.User'
        
  • 注意点:

    • 集成系统AbstractUser的好处
      • 1, AbstractUser提供了通用的属性, 比如: username ,password ….
      • 2, AbstractUser提供了密码加密方法, 和校验方法

15,用户模型类迁移

  • 目的: 可以迁移用户表数据, 并知道系统当中的相关表的产生
  • 操作流程:
    • 1, python manage.py makemigrations
    • 2 python manage.py migrate

16,注册业务分析

  • 目的: 知道美多商城注册业务流程
  • 图解:
    • 01.meiduomall项目day01学习笔记_redis_11

17,注册接口设计

  • 目的: 可以设计注册接口四要素
  • 图解:
    • 01.meiduomall项目day01学习笔记_redis_12

18,注册前端业务逻辑分析

  • 目的: 知道前端点击注册按钮之后的执行流程

  • 操作流程:

    • 1, 当点击注册按钮
    • 2, 触发on_submit方法, 会做对应的数据校验操作
    • 3, 进行表单post提交, 提交的接口是/register
  • 补充: 注册的时候跳转淘宝

    • 1, 在注册表单中添加{{csrf_input}} (register.html)

    • 2, 类视图,编写post方法(users/views.py)

      • class RegisterView(View):
            ...
        
            def post(self,request):
                return redirect('http://www.taobao.com')
        

19,注册后端业务实现

  • 目的: 可以获取前端的注册信息, 进行校验, 创建用户保存到数据库

  • 操作流程:

    • 1, 类视图(users/views.py)

      • # 1, 注册页面视图
        class RegisterView(View):
            ...
        
            def post(self,request):
                #1, 获取参数
                user_name = request.POST.get("user_name")
                pwd = request.POST.get("pwd")
                cpwd = request.POST.get("cpwd")
                phone = request.POST.get("phone")
                msg_code = request.POST.get("msg_code")
                allow = request.POST.get("allow")
        
                #2, 校验参数
                #2,1 为空校验
                if not all([user_name,pwd,cpwd,phone,msg_code,allow]):
                    return http.HttpResponseForbidden("参数不全")
        
                #2,2 两次密码一致
                if pwd != cpwd:
                    return http.HttpResponseForbidden("两次密码不一致")
        
                #2,3 手机号格式正确
                if not re.match(r'^1[3-9]\d{9}$',phone):
                    return http.HttpResponseForbidden("手机号格式有误")
        
                #2,5 短信验证码正确(下一次完成)
                print("msg_code = %s"%msg_code)
        
                #2,6 协议需要同意
                if allow != 'on':
                    return http.HttpResponseForbidden("协议需要同意")
        
                #3, 数据入库
                user = User.objects.create(username=user_name,password=pwd,mobile=phone)
        
                #4, 返回响应
                return redirect('http://www.taobao.com')