zoukankan      html  css  js  c++  java
  • 使用Vue和djangoframwork完成登录页面构建 001

     使用Vue和djangoframwork完成登录页面构建 001

     环境的搭建

    首先,我在我的电脑的F盘创建了一个文件夹 forNote,进入到这个文件夹中

    F:forNote>

     vue环境的搭建

    1. 安装脚手架

    F:forNote>npm install vue-cli -g
    

    2. 生成VUE项目

    F:forNote>vue init webpack myproject  // 后面是项目名

     在这里进行简单的配置

    F:forNote>vue init webpack myproject
    
    ? Project name y
    ? Project description y
    ? Author y
    ? Vue build standalone
    ? Install vue-router? Yes
    ? Use ESLint to lint your code? No
    ? Setup unit tests No
    ? Setup e2e tests with Nightwatch? No
    
       vue-cli · Generated "myproject".
    
       To get started:
    
         cd myproject
         npm install
         npm run dev
    
       Documentation can be found at https://vuejs-templates.github.io/webpack
    
    
    F:forNote>

    完成后,上面给出了一些提示,我们可以按照提示进行

    3. 进入项目并安装依赖

    F:forNote>cd myproject
    
    F:forNotemyproject>npm install
    

      

     4. 启动项目

    F:forNotemyproject>npm run dev
    

     上面的代码等同于 npm start

    通过上面几步,完成了vue项目的创建

    python环境的搭建

     1. 创建虚拟环境

    F:forNote>virtualenv venv
    

    执行结果

    F:forNote>virtualenv venv
    Using base prefix 'd:\program files (x86)\python\python35'
    New python executable in F:forNotevenvScriptspython.exe
    Installing setuptools, pip, wheel...done.
    
    F:forNote>
    

    2. 激活虚拟环境

    linux : source venv/bin/activate
    windows : venvScriptsactivate
    

    结果

    (venv) F:forNote>
    

    退出虚拟环境的命令是:deactivate

    3. 检测运行环境

    (venv) F:forNote>pip freeze    // 查看当前python环境安装了那些包
    

    4. 安装依赖包

    (venv) F:forNote>pip install django
    (venv) F:forNote>pip install djangorestframework
    

     这样的话,python环境简单的配置就完成了。

    前端页面的搭建

     为了少些css代码,安装一个bootstrap

     1. 安装bootstarp

    F:forNotemyproject>npm install bootstrap
    

      

     2. 写入配置

    用 Pycharm打开刚才配置好的Vue项目myproject文件夹,将bootstrap的配置写入以下位置

    "bootstrap": "^3.3.7"

    3. 引用

    找到下列位置,发现标红,我们需要改下配置

     修改下版本

     

     我们后面还会用到axios,这一一起配置了,步骤和上面一样

     --> npm install axios

    -->  配置package.json

    -->  main.js 中引用

    4. login页面的书写

      1 <template>
      2   <!--<img src="../assets/logo.png">-->
      3   <div class="outter">
      4     <h1 class="title">Login</h1>
      5     <p>
      6       <label for="username">Username </label>
      7       <input class="form-control" type="text" id="username" placeholder="Username" v-model="username">
      8     </p>
      9     <p>
     10       <label for="password">Password</label>
     11       <input class="form-control" type="password" id="password" placeholder="Password" v-model="password">
     12     </p>
     13     <span v-show="show" class="error_info">{{ error_info }}</span>
     14     <p>
     15       <input type="button" value="登录" class="btn btn-primary btn-block" v-on:click="login">
     16     </p>
     17   </div>
     18 </template>
     19 
     20 <script>
     21   // 创建cookie
     22   function setCookie(key, value) {
     23     document.cookie = key + '=' + value
     24   }
     25   // 获取cookie
     26   function getCookie(name) {
     27     var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
     28     if (arr = document.cookie.match(reg))
     29       return unescape(arr[2]);
     30     else
     31       return null;
     32   }
     33   // 删除cookie
     34   function delCookie(name) {
     35     var exp = new Date();
     36     exp.setTime(exp.getTime() - 1);
     37     var cval = getCookie(name);
     38     if (cval != null)
     39       document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
     40   }
     41 
     42 
     43   export default {
     44     name: 'Login',
     45     data () {
     46       return {
     47         msg: 'Welcome to Your Vue.js App',
     48         username: 'admin',
     49         password: 'admin',
     50         tk: '',
     51         error_info: '',
     52         show: false
     53       }
     54     },
     55     methods: {
     56       login(){
     57         var data = {username: this.username, password: this.password}
     58         var url = 'http://127.0.0.1:8000/api/v1/auth/'
     59         var self = this;
     60 //              {"headers": {'Content-Type': 'application/x-www-form-urlencoded'}}
     61         this.$http.post(url, data).then(function (response) {
     62           if (response.data.code == 1002) {
     63             self.show = false;
     64             self.tk = response.data.tk;
     65             setCookie('tk', self.tk);
     66             window.location.href = "/#/index/";
     67 
     68 
     69           } else if (response.data.code == 1001) {
     70             console.log('false');
     71             self.show = true;
     72             self.error_info = '用户名或密码错误';
     73             console.log(getCookie('tk'))
     74 
     75           }
     76         }).catch(function (response) {
     77           console.log(response)
     78         })
     79       }
     80     }
     81   }
     82 </script>
     83 
     84 <style scoped>
     85   .outter {
     86     width: 400px;
     87     margin: 0 auto;
     88     position: relative;
     89     top: 150px;
     90   }
     91 
     92   label {
     93     float: left;
     94   }
     95 
     96   p {
     97     margin-top: 10px;
     98   }
     99 
    100   #username, #password {
    101     text-indent: 6px;
    102   }
    103 
    104   .error_info {
    105     color: red;
    106     float: right;
    107     position: relative;
    108     top: -5px;
    109   }
    110 </style>
    Login页面

    5.  路由配置

     1 import Vue from 'vue'
     2 import Router from 'vue-router'
     3 import HelloWorld from '@/components/HelloWorld'
     4 import Login from '@/components/Login'                // 导入文件
     5 
     6 Vue.use(Router)
     7 
     8 export default new Router({
     9   routes: [
    10     {
    11       path: '/',
    12       name: 'HelloWorld',
    13       component: HelloWorld
    14     },
    15     {
    16       path: '/login/',               // 配置路由
    17       name: 'Login',                 // 设置别名
    18       component: Login               // 路由对应的页面
    19     }
    20   ]
    21 })
    配置路由文件

    后端页面的搭建

    1. 创建django项目

    2. 创建表

     1 from django.db import models
     2 
     3 # Create your models here.
     4 class UserInfo(models.Model):
     5     username = models.CharField(max_length=64, verbose_name='用户名')
     6     password = models.CharField(max_length=64, verbose_name='密码')
     7     email = models.EmailField(blank=True, null=True, verbose_name='邮箱')
     8 
     9     def __str__(self):
    10         return self.username
    11 
    12 class Token(models.Model):
    13     user = models.OneToOneField(to="UserInfo", verbose_name='用户')
    14     value = models.CharField(max_length=64, verbose_name='Token值')
    models.py

    3. 配置路由url

    1 from django.conf.urls import url
    2 from django.contrib import admin
    3 from app01 import views
    4 
    5 urlpatterns = [
    6     url(r'^admin/', admin.site.urls),
    7     url(r'^api/(?P<version>w+)/auth/$', views.AuthView.as_view(), name="auth"),  # 登录验证的路由
    8 ]
    urs.py

    4.写视图类

     1 from django.shortcuts import render
     2 from django.http import HttpResponse, JsonResponse
     3 from rest_framework.views import APIView
     4 from app01 import models
     5 from app01.utils.tools.tools import gen_token
     6 from rest_framework.request import Request
     7 
     8 
     9 # pip install djangorestframework
    10 class AuthView(APIView):
    11     """
    12     登录验证
    13     """
    14     def get(self, request, *args, **kwargs):
    15         """
    16         处理get请求的函数,暂时用不到
    17         """
    18         self.dispatch
    19 
    20         return HttpResponse("....")
    21 
    22     def post(self, request, *args, **kwargs):
    23         """
    24         处理post请求的函数,这里主要用来提交登录用户信息并验证返回token值
    25         """
    26         username = request.data.get('username')
    27         password = request.data.get('password')
    28         user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
    29 
    30         if user_obj:
    31             # 如果验证成功,为该用户创建一个Token值,下次带过来,作为登录的标志
    32             tk = gen_token(username)
    33             # 如果有这条记录就跟新,如果没有这条记录就创建
    34             models.Token.objects.update_or_create(user=user_obj, defaults={'value': tk})
    35             # 验证成功,返会code:1002以及tk的值
    36             response = JsonResponse({'code': 1002, 'username': username, 'tk': tk})
    37         else:
    38             # 验证失败,返会code:1001
    39             response = JsonResponse({'code': 1001})
    40         # 由于是 cors,所以需要设置响应头
    41         response['Access-Control-Allow-Origin'] = 'http://localhost:8080'
    42 
    43         return response
    44 
    45     def options(self, request, *args, **kwargs):
    46         """
    47         本次登录的功能是cors中的复杂请求,所以需要先通过option进行预检        
    48         """
    49         # 本次预检返回的内容不重要
    50         response = HttpResponse('')
    51         # 设置允许访问的地址
    52         response['Access-Control-Allow-Origin'] = 'http://localhost:8080'
    53         # 设置允许的提交方式
    54         response['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE'
    55         # 设置可以携带的请求头
    56         response['Access-Control-Allow-Headers'] = "Content-Type"
    57         return response
    Views.py
     1 #! /usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # __author__ = "Always"
     4 # Date: 2017/11/25
     5 
     6 
     7 def gen_token(username):
     8     """
     9     使用用户的用户名以及时间戳进行sha224加密,作为登录的标识
    10         下次访问可以直接携带这个参数过来就可以了
    11     """
    12     import time
    13     import hashlib
    14     sha1 = hashlib.sha224()
    15     sha1.update(username.encode('utf-8'))
    16     sha1.update(str(time.time()).encode('utf-8'))
    17     return sha1.hexdigest()
    Token方法

    5. 运行django项目查看结果

    结果完成,

    其它

    自动执行:加载完页面后就会执行

    <script>
      export default {
        name: 'HelloWorld',
        data () {
          return {
            course_list: []
          }
        },
        mounted: function () {  // 默认执行下面的代码
          this.getCourse()
        },
        methods: {
          getCourse: function () {
            var self = this
            this.$axios.request({
              url: this.$store.state.apiList.courses,
              method: 'GET'
            }).then(function (response) {
              console.log(response.data.data)
              self.course_list = response.data.data
            }).catch(function (response) {
              console.log(response)
            })
          }
        }
      }
    </script>
    

      

  • 相关阅读:
    Apache Jmeter 性能测试
    linux 达梦数据库 命令行 卸载
    vue控制台报错Duplicate keys detected: 'xxxx'. This may cause an update error.解决方案
    springboot报错说 Failed to parse multipart servlet request; nested exception is java.io.IOException
    简单理解Callable接口
    Windows下设置Mongodb用户名密码
    Win10 搭建FTP环境,并使用Java实现上传,下载,删除
    【小组展示】1
    【计网II】
    【密码学】AES
  • 原文地址:https://www.cnblogs.com/alwaysInMe/p/7898473.html
Copyright © 2011-2022 走看看