註冊功能(一)

用戶註冊功能

註冊即用戶在後臺數據庫中增長了一條數據javascript

一.用戶模型表的設計

1.用戶表的所需字段

  • 用戶名css

  • 密碼html

  • 郵箱前端

  • 手機號java

  • 郵箱可用性數據庫

2.用戶模型的設計

因爲django中內置了許多模塊,這也使得他開發效率極高,因此在設計模型時若是僅僅是引用django內置的user模塊功能確定不足,須要本身去拓展。django

擴展user模型的兩種方法後端

1.若是不須要改變數據庫的存儲內容(不修改USER模型中的字段),只是改變行爲,則能夠建立一個新的User代理模型。session

2.若是想要存儲與User相關的信息,可使用OneToOneField到包含其信息的模型這種one-to-one模型常常被稱做Profile模型,由於它可能存儲站點用戶的非身份驗證的相關信息。例如:app

from django.contrib.auth.models import User

class Employee(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   department = models.CharField(max_length=100)
自定義user模型

在django中有提供一個虛擬的User模型,其中有大部分是已經寫好的,因此咱們僅僅只須要根據咱們額外的一些字段進行繼承添加便可

開啓一個新的項目官方推薦使用本身定義個User模型,在本身定義的中進行擴展

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
   """
  經過繼承AbstractUser,而後再進行添加mobile email_active 字段,
  AbstractUser:一個虛擬的庫,在建立遷移時不會將虛擬的進行遷移。
  """
   mobile = models.CharField('手機號',max_length=11,help_text='手機號',unique=True,
                             error_messages={'unique': '此手機號已被註冊'})
   email_active = models.BooleanField('郵箱狀態', default='False')

   class Meta:
       db_table = 'tb_user'        # 指定數據庫中的表名
       verbose_name = '用戶'      # 指定admin系統中的名字
       verbose_name_plural = verbose_name  # 顯示覆數

   def __str__(self):
       return self.username

   # 當使用createsupperuser時 不須要給email而是須要提交手機號
   # 以後還須要去Usermanager中將必須傳入的email設置默認爲None
   REQUIRED_FIELDS = ['mobile']

   objects = UserManager()

在寫完以後在settings文件中進行AUTH_USER_MODEL = 'user.User'的配置

因爲上面對createsuperuser進行了修改固然在相對應的管理器中也要進行修改以下:

from django.db import models
from django.contrib.auth.models import AbstractUser,UserManager as Manager


class UserManager(Manager):
   """
  自定義user manager 在使用createsupperuser時,將須要提交的email撤銷掉。
  """
   def create_superuser(self, username, password, email=None, **extra_fields):
       return super().create_superuser(username=username,password=password,email=email,**extra_fields)

寫好以後要在User中添加進去即

objects = UserManager()

當遷移時出現以下錯誤

有多是以下問題:

1.setting文件數據庫的配置數據不對

改爲如上

2.db。cnf文件中user不對

 

二.需求分析

1.接口設計

對於本次業務分爲多少個子業務,將每個子業務作成一個接口(即每一個子業務一個view),

分析接口的功能與任務,對每一個藉口的數據及請求方式與返回數據分析

  • 請求方式:get post put 等

  • 接口url的定義

  • 接口所須要的參數(路徑參數,查詢字符串,請求表單,JSON等)

  • 返回的數據及返回數據的格式

 

2.註冊功能分析

  • 從一個網頁訪問註冊網頁發送一次請求

  • 驗證碼圖片加載一次請求

  • 點擊刷新驗證碼圖片一次請求

  • 短信驗證碼一次請求

畫成圖以下:

 

三.註冊頁面的實現

1.接口設計

條目 內容
請求方法 GET
路徑參數 /user/register/
參數

2.後端代碼

views

class Register(View):
   def get(self,request):
       return render(request, 'user/register.html')

urls

urlpatterns = [
   path('login/', views.login,name='login'),
   path('register', views.Register.as_view(),name='register'),
]

3.前端代碼

{% extends 'base/base.html' %}
{% load static %}
{% block title %}
  註冊
{% endblock %}
{% block link %}
   <link rel="stylesheet" href="{% static 'css/authPro/auth.css' %}">
{% endblock %}
{% block main_start %}
   <!-- container start -->
<main id="container">
 <div class="register-contain">
   <div class="top-contain">
     <h4 class="please-register">請註冊</h4>
     <a href="javascript:void(0);" class="login">當即登陸 &gt;</a>
   </div>
   <form action="" method="post" class="form-contain">


     <div class="form-item">
       <input type="text" placeholder="請輸入用戶名" name="username" class="form-control" autocomplete="off">
     </div>
     <div class="form-item">
       <input type="password" placeholder="請輸入密碼" name="password" class="form-control">
     </div>
     <div class="form-item">
       <input type="password" placeholder="請輸入確認密碼" name="password_repeat" class="form-control">
     </div>
     <div class="form-item">
       <input type="tel" placeholder="請輸入手機號" name="telephone" class="form-control" autocomplete="off" autofocus>
     </div>
     <div class="form-item">
       <input type="text" placeholder="請輸入圖形驗證碼" name="captcha_graph" class="form-captcha">
       <a href="javascript:void(0);" class="captcha-graph-img">
         <img src="{% url 'verification:image_code' %}" alt="驗證碼" title="點擊刷新">
       </a>
     </div>
     <div class="form-item">
       <input type="text" placeholder="請輸入短信驗證碼" name="sms_captcha" class="form-captcha" autocomplete="off">
       <a href="javascript:void(0);" class="sms-captcha" title="發送驗證碼">獲取短信驗證碼</a>
     </div>
     <div class="form-item">
       <input type="submit" value="當即註冊" class="register-btn">
     </div>
   </form>
 </div>
</main>
<!-- container end -->
{% endblock %}
{% block src %}
   <script src="{% static 'js/user/image.js' %}">

   </script>
{% endblock %}

4.js文件

$(()=> {
   //點擊刷新圖形驗證碼
   $( '.captcha-graph-img img').click(function () {
       // 必須加隨機數,不然系統視爲同一請求不會刷新圖片
       $(this).attr('src', '/image_code/?rand='+ Math.random())
  })
});

四。圖形驗證碼的實現

1.接口設計

條目 內容
請求方式 get
路徑參數 /image_code/
參數設置 查詢參數

參數說明:

參數名 類型 是否必須 描述
rand 字符串 輸入的用戶名

返回結果:驗證碼圖片

2.後端代碼

verification views

import logging
# 有關導入 首先是導入系統的庫


# 而後導入框架庫
from django.shortcuts import render
from django.http import HttpResponse

# 最後導入本身建立的模型
from verification.constant import IMAGE_CODE_EXPIRES
from utils.captcha.captcha import captcha
# Create your views here.

logger = logging.getLogger('django')

def image_code(request):
   """
  用於生成驗證碼圖片
  """
   # 1.生成驗證碼及圖片
   text, image = captcha.generate_captcha()
   # 2.保存驗證碼 session保存
   request.session['image_code'] = text
   request.session.set_expiry(IMAGE_CODE_EXPIRES)
   # 3.記錄一個日誌
   logger.info('image_code{}'.format(text))
   # 4.返回驗證碼圖片
   return HttpResponse(content=image,content_type='image/jpg')

urls

from  django.urls import path
from . import views

app_name = 'verification'

urlpatterns = [
   path('image_code/',views.image_code,name='image_code')
]

 

用戶註冊功能

註冊即用戶在後臺數據庫中增長了一條數據

一.用戶模型表的設計

1.用戶表的所需字段

  • 用戶名

  • 密碼

  • 郵箱

  • 手機號

  • 郵箱可用性

2.用戶模型的設計

因爲django中內置了許多模塊,這也使得他開發效率極高,因此在設計模型時若是僅僅是引用django內置的user模塊功能確定不足,須要本身去拓展。

擴展user模型的兩種方法

1.若是不須要改變數據庫的存儲內容(不修改USER模型中的字段),只是改變行爲,則能夠建立一個新的User代理模型。

2.若是想要存儲與User相關的信息,可使用OneToOneField到包含其信息的模型這種one-to-one模型常常被稱做Profile模型,由於它可能存儲站點用戶的非身份驗證的相關信息。例如:

from django.contrib.auth.models import User

class Employee(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   department = models.CharField(max_length=100)
自定義user模型

在django中有提供一個虛擬的User模型,其中有大部分是已經寫好的,因此咱們僅僅只須要根據咱們額外的一些字段進行繼承添加便可

開啓一個新的項目官方推薦使用本身定義個User模型,在本身定義的中進行擴展

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
   """
  經過繼承AbstractUser,而後再進行添加mobile email_active 字段,
  AbstractUser:一個虛擬的庫,在建立遷移時不會將虛擬的進行遷移。
  """
   mobile = models.CharField('手機號',max_length=11,help_text='手機號',unique=True,
                             error_messages={'unique': '此手機號已被註冊'})
   email_active = models.BooleanField('郵箱狀態', default='False')

   class Meta:
       db_table = 'tb_user'        # 指定數據庫中的表名
       verbose_name = '用戶'      # 指定admin系統中的名字
       verbose_name_plural = verbose_name  # 顯示覆數

   def __str__(self):
       return self.username

   # 當使用createsupperuser時 不須要給email而是須要提交手機號
   # 以後還須要去Usermanager中將必須傳入的email設置默認爲None
   REQUIRED_FIELDS = ['mobile']

   objects = UserManager()

在寫完以後在settings文件中進行AUTH_USER_MODEL = 'user.User'的配置

因爲上面對createsuperuser進行了修改固然在相對應的管理器中也要進行修改以下:

from django.db import models
from django.contrib.auth.models import AbstractUser,UserManager as Manager


class UserManager(Manager):
   """
  自定義user manager 在使用createsupperuser時,將須要提交的email撤銷掉。
  """
   def create_superuser(self, username, password, email=None, **extra_fields):
       return super().create_superuser(username=username,password=password,email=email,**extra_fields)

寫好以後要在User中添加進去即

objects = UserManager()

當遷移時出現以下錯誤

有多是以下問題:

1.setting文件數據庫的配置數據不對

改爲如上

2.db。cnf文件中user不對

 

二.需求分析

1.接口設計

對於本次業務分爲多少個子業務,將每個子業務作成一個接口(即每一個子業務一個view),

分析接口的功能與任務,對每一個藉口的數據及請求方式與返回數據分析

  • 請求方式:get post put 等

  • 接口url的定義

  • 接口所須要的參數(路徑參數,查詢字符串,請求表單,JSON等)

  • 返回的數據及返回數據的格式

 

2.註冊功能分析

  • 從一個網頁訪問註冊網頁發送一次請求

  • 驗證碼圖片加載一次請求

  • 點擊刷新驗證碼圖片一次請求

  • 短信驗證碼一次請求

畫成圖以下:

 

三.註冊頁面的實現

1.接口設計

條目 內容
請求方法 GET
路徑參數 /user/register/
參數

2.後端代碼

views

class Register(View):
   def get(self,request):
       return render(request, 'user/register.html')

urls

urlpatterns = [
   path('login/', views.login,name='login'),
   path('register', views.Register.as_view(),name='register'),
]

3.前端代碼

{% extends 'base/base.html' %}
{% load static %}
{% block title %}
  註冊
{% endblock %}
{% block link %}
   <link rel="stylesheet" href="{% static 'css/authPro/auth.css' %}">
{% endblock %}
{% block main_start %}
   <!-- container start -->
<main id="container">
 <div class="register-contain">
   <div class="top-contain">
     <h4 class="please-register">請註冊</h4>
     <a href="javascript:void(0);" class="login">當即登陸 &gt;</a>
   </div>
   <form action="" method="post" class="form-contain">


     <div class="form-item">
       <input type="text" placeholder="請輸入用戶名" name="username" class="form-control" autocomplete="off">
     </div>
     <div class="form-item">
       <input type="password" placeholder="請輸入密碼" name="password" class="form-control">
     </div>
     <div class="form-item">
       <input type="password" placeholder="請輸入確認密碼" name="password_repeat" class="form-control">
     </div>
     <div class="form-item">
       <input type="tel" placeholder="請輸入手機號" name="telephone" class="form-control" autocomplete="off" autofocus>
     </div>
     <div class="form-item">
       <input type="text" placeholder="請輸入圖形驗證碼" name="captcha_graph" class="form-captcha">
       <a href="javascript:void(0);" class="captcha-graph-img">
         <img src="{% url 'verification:image_code' %}" alt="驗證碼" title="點擊刷新">
       </a>
     </div>
     <div class="form-item">
       <input type="text" placeholder="請輸入短信驗證碼" name="sms_captcha" class="form-captcha" autocomplete="off">
       <a href="javascript:void(0);" class="sms-captcha" title="發送驗證碼">獲取短信驗證碼</a>
     </div>
     <div class="form-item">
       <input type="submit" value="當即註冊" class="register-btn">
     </div>
   </form>
 </div>
</main>
<!-- container end -->
{% endblock %}
{% block src %}
   <script src="{% static 'js/user/image.js' %}">

   </script>
{% endblock %}

4.js文件

$(()=> {
   //點擊刷新圖形驗證碼
   $( '.captcha-graph-img img').click(function () {
       // 必須加隨機數,不然系統視爲同一請求不會刷新圖片
       $(this).attr('src', '/image_code/?rand='+ Math.random())
  })
});

四。圖形驗證碼的實現

1.接口設計

條目 內容
請求方式 get
路徑參數 /image_code/
參數設置 查詢參數

參數說明:

參數名 類型 是否必須 描述
rand 字符串 輸入的用戶名

返回結果:驗證碼圖片

2.後端代碼

verification views

import logging
# 有關導入 首先是導入系統的庫


# 而後導入框架庫
from django.shortcuts import render
from django.http import HttpResponse

# 最後導入本身建立的模型
from verification.constant import IMAGE_CODE_EXPIRES
from utils.captcha.captcha import captcha
# Create your views here.

logger = logging.getLogger('django')

def image_code(request):
   """
  用於生成驗證碼圖片
  """
   # 1.生成驗證碼及圖片
   text, image = captcha.generate_captcha()
   # 2.保存驗證碼 session保存
   request.session['image_code'] = text
   request.session.set_expiry(IMAGE_CODE_EXPIRES)
   # 3.記錄一個日誌
   logger.info('image_code{}'.format(text))
   # 4.返回驗證碼圖片
   return HttpResponse(content=image,content_type='image/jpg')

urls

from  django.urls import path
from . import views

app_name = 'verification'

urlpatterns = [
   path('image_code/',views.image_code,name='image_code')
]
相關文章
相關標籤/搜索