10. 项目实战前台之会员注册与登陆

  • 本节完成前台会员登录操作,关于会员注册留为作业由学员自行完成(可参考后台的会员信息添加)。

(1). 项目urls路由信息配置

  • 在数据库 shopdb 中已存在数据表users,并且内有测试数据。

  • 在common应用目录中的myobject/common/models.py 模型文件中,已存在Users模型类的定义。

  • 打开根路由文件:myobject/web/urls.py路由文件,编辑路由配置信息


from django.conf.urls import url

from web.views import index

urlpatterns = [
    #网站前台
    url(r'^$',index.index,name="index"), #首页
    url(r'^list$',index.lists,name="list"), #商品列表展示
    #url(r'^list/(?P<pIndex>[0-9]+)$',index.lists,name="list"), #分页商品列表展示
    url(r'^detail/(?P<gid>[0-9]+)$',index.detail,name="detail"), #商品详情

    # 会员及个人中心等路由配置
    url(r'^login$', index.login, name="login"),
    url(r'^dologin$', index.dologin, name="dologin"),
    url(r'^logout$', index.logout, name="logout"),

]

 (2). 编辑视图文件

  • 新建视图文件:myobject/web/views/index.py 视图文件,并进行编辑
from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import redirect
from django.core.urlresolvers import reverse

from common.models import Users

# =============商品展示========================
def index(request):
    '''项目前台首页'''
    return render(request,"web/index.html")

def lists(request,pIndex=1):
    '''商品列表页'''
    return render(request,"web/list.html")

def detail(request,gid):
    '''商品详情页'''
    return render(request,"web/detail.html")

# ==============前台会员登录====================
def login(request):
    '''会员登录表单'''
    return render(request,'web/login.html')

def dologin(request):
    '''会员执行登录'''
    # 校验验证码
    verifycode = request.session['verifycode']
    code = request.POST['code']
    if verifycode != code:
        context = {'info':'验证码错误!'}
        return render(request,"web/login.html",context)

    try:
        #根据账号获取登录者信息
        user = Users.objects.get(username=request.POST['username'])
        #判断当前用户是否是后台管理员用户
        if user.state == 0 or user.state == 1:
            # 验证密码
            import hashlib
            m = hashlib.md5() 
            m.update(bytes(request.POST['password'],encoding="utf8"))
            if user.password == m.hexdigest():
                # 此处登录成功,将当前登录信息放入到session中,并跳转页面
                request.session['vipuser'] = user.toDict()
                return redirect(reverse('index'))
            else:
                context = {'info':'登录密码错误!'}
        else:
            context = {'info':'此用户为非法用户!'}
    except:
        context = {'info':'登录账号错误!'}
    return render(request,"web/login.html",context)

def logout(request):
    '''会员退出'''
    # 清除登录的session信息
    del request.session['vipuser']
    # 跳转登录页面(url地址改变)
    return redirect(reverse('login'))

(3). 编写模板文件

  • 3.1. 打开父类模板:/templates/web/base.html ,编辑导航栏代码
    ...
    <li class="layout-header-service-item" id="layoutHeaderUser">
        <a class="layout-header-service-link g-user" style="background: #fff;width:auto;" href="#">
          <i class="glyphicon glyphicon-user"></i>
          <span>{{request.session.vipuser.name}}</span>
        </a>
        <div class="layout-user-downmenu">
          <ul class="layout-user-downmenu-list">
          {% if request.session.vipuser %}
            <li class="layout-user-downmenu-item">
              <a href="#" class="layout-user-downmenu-link" data-mtype="wmz_public_grzx_myorder">个人中心</a>
            </li>
            <li class="layout-user-downmenu-item">
              <a href="#" class="layout-user-downmenu-link" data-mtype="wmz_public_grzx_myorder">我的订单</a>
            </li>
            <li class="layout-user-downmenu-item">
              <a href="{% url 'logout' %}" class="layout-user-downmenu-link" data-mtype="wmz_public_grzx_mformy">退出</a>
            </li>
          {% else %}
            <li class="layout-user-downmenu-item">
              <a href="{% url 'login'%}" class="layout-user-downmenu-link">立即登录</a>
            </li>
            <li class="layout-user-downmenu-item">
              <a href="#" target="_blank" class="layout-user-downmenu-link" data-mtype="wmz_public_grzx_register">立即注册</a>
            </li>
          {% endif %}
          </ul>
        </div>
    </li>
    ...
  • 3.2. 项目前台登录页模板:/templates/web/login.html
{% load static from staticfiles %}
<!DOCTYPE html>
<html lang="cn">
<head>
  <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title> Flyme 账号 - 登录</title>
   <meta name="description" content="欢迎登录和注册 Flyme 账号,您可以体验手机云服务功能,包括:在线下载应用,同步手机数据和查找手机等,让您的手机管理更加智能。" />
  <meta name="keywords" content="魅族  meizu 登录flyme 云服务  查找手机  充值账号  MX M9 MX2" />    <link href="{% static 'web/img/favicon.ico' %}" rel="shortcut icon" type="image/x-icon"/>
    <link href="{% static 'web/img/favicon.ico' %}" rel="icon" type="image/x-icon">
    <!-- Bootstrap -->
    <link href="{% static 'web/css/bootstrap.min.css' %}" rel="stylesheet">
    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="{% static 'web/js/jquery-1.12.4.min.js' %}"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="{% static 'web/js/bootstrap.min.js' %}"></script>
    <!-- 兼任ie9以下 -->
    <!--[if lt IE 9]>
          <script src="http://cdn.bootcss.com/html5shiv/3.7.0/html5shiv.min.js"></script>
          <script src="http://cdn.bootcss.com/respond.js/1.3.0/respond.min.js"></script>
    <![endif]-->
    <!-- 自定义 -->
    <link rel="stylesheet" type="text/css" href="{% static 'web/css/global.css' %}">
    <link rel="stylesheet" type="text/css" href="{% static 'web/css/register.css' %}">
    <script type="text/javascript" src="{% static 'web/js/rem.js' %}"></script>
    <script type="text/javascript" src="{% static 'web/js/topNav.js' %}"></script>

</head>
<body>
  <!-- 导航 --> 
  <div class="layout-header hidden-xs hidden-sm" id="scroll-wrap">
    <nav class="navbar navbar-default header ">
      <div class="container clearfix">
          <div class="layout-header-logo navbar-left">
              <a href="{% url 'index' %}" class="layout-header-logo-link" alt="魅族科技">
                <img src="{% static 'web/img/logo.png' %}">
              </a>
          </div>      
      </div>
    </nav>
  </div><!-- 导航 E--> 

  <!-- 主内容区域 -->
  <div id="content" class="content">  
    <div class="container-fluid"> 
    <div class="banner-box hidden-xs hidden-sm">
      <div class="container">
        <form id="mainForm" name="mainForm" action="{% url 'dologin' %}" method="post" class="main-form">
          {% csrf_token %}
          <div class="tab-title">
            <a class="linkAGray" id="toAccountLogin" href="javascript:void(0);">账号登录</a>
          </div><br/>
          {% if info %}
          <div class="tip-box">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
              <i class="glyphicon glyphicon-exclamation-sign"></i>
              <span class="tip-font">{{info}}</span>
              <span aria-hidden="true" class="cha">&times;</span>
            </button>
          </div>
          {% endif %}
          <div class="normalInput cycode-box fieldInput" id="cycode-box">
            <div class="cycode-selectbox">
              <input class="ipt-account inp-focus" name="username" id="account" maxlength="50" placeholder="登录账号" autocomplete="off">
            </div>
          </div>
          <div class="normalInput fieldInput passwd-box">
            <input class="inp-focus" name="password" id="password" maxlength="16"  autocomplete="off" placeholder="登录密码" type="password"/>
           </div>
          <div class="normalInput fieldInput passwd-box">
            <input class="inp-focus" name="code" style="width:100px;" maxlength="16" placeholder="验证码" autocomplete="off" type="text" />
            <img src="{% url 'myadmin_verify' %}?id=1" onclick="this.src='{% url 'myadmin_verify' %}?sn='+Math.random()"/>
           </div>

           <a id="register" href="javascript:document.mainForm.submit();" class="fullBtnBlue">登录</a>
          <div class="transferField">
            <a class="go2forgetpwd linkABlue rememberFieldForA" href="#">忘记密码?</a>
            <a class="go2register linkABlue" href="./register.html" id="toRegister">注册</a>
            <span>测试号:zhangsan 密码:123</span>
          </div>
        </form>

      </div>
    </div>
      <!-- 移动端结构 -->
      <form id="mainForm" class="main-form app-main-form">
        <div class="tab-title">
          <a class="linkAGray" id="toAccountLogin" href="javascript:void(0);">账号登录</a>
        </div>
        <div class="tip-box visiblility-hidden">
          <button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <i class="glyphicon glyphicon-exclamation-sign"></i>
            <span class="tip-font"></span>
            <span aria-hidden="true" class="cha">&times;</span>
          </button>
        </div>
        <div class="normalInput cycode-box show-cycode" id="cycode-box">
          <div class="cycode-selectbox">
            <input id="phone" name="phone" class="ipt-phone inp-focus" maxlength="11" placeholder="手机号码" autocomplete="off">
          </div>
        </div>
        <div class="normalInput box-input">
          <input class="pswInput inp-focus" name="kapkey" id="kapkey" maxlength="6" placeholder="密码" autocomplete="off" tabindex="3" type="text">
        </div>

        <a id="register"  class="fullBtnBlue">登录</a>
        <div class="transferField">
          <a class="go2forgetpwd linkABlue rememberFieldForA" href="#">忘记密码?</a>
          <a class="go2register linkABlue" href="./register.html" id="toRegister">注册</a>
        </div>
      </form>
      <!-- 移动端结构 E-->

    </div>
  </div>
  <!-- 主内容区域  E-->

  <!-- 底部区域 -->
  <div id="flymeFooter " class="footerWrap hidden-xs hidden-sm">
    <div class="container">
      <div class="footer-layer1">
        <div class="footer-innerLink">
          <a href="#" target="_blank" title="关于魅族">关于魅族</a>
          <img class="foot-line" src="{% static 'web/img/space.gif' %}">
          <a href="#" target="_blank" title="工作机会">工作机会</a>
          <img class="foot-line" src="{% static 'web/img/space.gif' %}">
          <a href="#" target="_blank" title="联系我们">联系我们</a>
          <img class="foot-line" src="{% static 'web/img/space.gif' %}">
          <a href="#" target="_blank" title="法律声明">法律声明</a>
          <img class="foot-line" src="{% static 'web/img/space.gif' %}">

          <div href="javascript:void(0);" id="globalName" class="footer-language" title="简体中文">
            简体中文&nbsp;&nbsp;&nbsp;
            <div id="globalContainer" class="footer-language_menu">
              <a href="#" id="i18n-link" title="English" class="ClobalItem">English</a>
            </div>
          </div>
        </div>
        <div class="footer-service">
          <span class="service-label">客服热线</span>
          <span class="service-num">400-888-6666</span>
          <a id="service-online" class="service-online" href="javascript:void(0);" title="在线客服">在线客服</a>
        </div>
        <div class="footer-outerLink">
          <a class="footer-sinaMblog" href="#" target="_blank"><i class="i_icon"></i></a>

          <a id="footer-weChat" class="footer-weChat" href="javascript:void(0);" target="_blank"><i class="i_icon"></i></a>
          <a class="footer-qzone" href="#" target="_blank"><i class="i_icon"></i></a>
        </div>
      </div>
      <div class="clear"></div>
      <div id="flymeCopyright" class="copyrightWrap">
        <div class="copyrightInner">
          <span>&copy;2018 Meizu Telecom Equipment Co., Ltd. All rights reserved.</span>
          <a href="#" class="linkAGray" target="_blank">备案号: 京ICP备123456789号-4</a>
          <a href="#" class="linkAGray" target="_blank">经营许可证编号: 京A1-20280198</a>
          <a target="_blank" href="#" class="linkAGray">营业执照</a>
        </div>
      </div>
    </div>
  </div>
  <!-- 底部区域 E -->

<script type="text/javascript">
  //
  nLogin();
</script>
</body>
</html>