Vue 项目 Vue + restfulframework

实现登录认证

- django

views

class MyResponse():
def __init__(self):
self.status = 100
self.msg = None @property
def get_dic(self):
return self.__dict__ #token
def get_token(username):
import hashlib
import time
md = hashlib.md5()
# update内必须传bytes格式
md.update(username.encode('utf-8'))
md.update(str(time.time()).encode('utf-8'))
return md.hexdigest()
#认证
class Login(APIView):
authentication_classes = []
def post(self, request):
response = MyResponse()
name = request.data.get('username')
pwd = request.data.get('password')
user = models.User.objects.filter(username=name, password=pwd).first()
print(name,pwd)
name1 =request.GET.get('username')
print(name1)
if user:
response.msg = '登陆成功'
response.username = name
# 登陆成功,返回一个随机字符串,以后在发请求,都携带这个字符串
token = get_token(name)
response.token = token
# 把随机字符串保存到数据库,有就更新,没有就创建
# ret=models.UserToken.objects.update_or_create(user_id=user.id,kwargs={'token':token})
ret = models.UserToken.objects.update_or_create(user=user, defaults={'token': token}) else:
response.msg = '用户名或密码错误'
response.status = 101
obj = JsonResponse(response.get_dic)
obj['Access-Control-Allow-Origin']='*'
return obj #解决跨域问题 中间件
from django.utils.deprecation import MiddlewareMixin class CorsMiddleWare(MiddlewareMixin):
def process_response(self,request,response):
if request.method=="OPTIONS":
print(111)
#不能加*
response["Access-Control-Allow-Headers"]="*"
response["Access-Control-Allow-Origin"] = "*"
response['Access-Control-Allow-Methods'] = 'POST'
return response

setting

把中间件添加到setting的配置中
注释csrftoken认证
MIDDLEWARE = [
'app01.views.CorsMiddleWare',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', ]

urls

urlpatterns = [
re_path('login/', views.Login.as_view()),
]

- Vue

安装包

cnpm install --save axios vuex

npm install vue-cookie --save

route.js

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
import Index from '../src/components/index.vue'
// import Login from '../src/components/Login.vue' Vue.use(Router); export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/index',
name: 'Index',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
// 两种都可以,要不上面导入进来,或者直接定vue组件的路径
// component: () => import(/* webpackChunkName: "about" */ '../src/components/index.vue')
component:Index
},
{
path: '/login',
name: 'Login',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../src/components/Login.vue')
}
]
})

store.js

import Vue from 'vue'
import Vuex from 'vuex'
import Cookie from 'vue-cookies' Vue.use(Vuex); export default new Vuex.Store({
state: {
username:Cookie.get('username'),
token:Cookie.get('token')
// Cookie.get('username') Cookie.get('token')
},
mutations: {
//组件中通过this.$store.commit(参数)调用
saveToken (state,data) {
state.username = data.username;
state.token = data.token;
Cookie.set('username',data.username,'1min');
Cookie.set('token',data.token,'1min')
},
//清空token和cookie
clearToken (state) {
state.username = null;
state.token = null;
Cookie.remove('username');
Cookie.remove('token')
} },
actions: { }
})

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import Axios from 'axios'
import VueCookie from 'vue-cookies'
// import 'bootstrap/dist/css/bootstrap.css'
Vue.prototype.$axios = Axios;
Vue.prototype.$Cookies = VueCookie; Vue.config.productionTip = false; new Vue({
router,
store,
render: h => h(App)
}).$mount('#app');

App.vue

<template>
<div>
<!--首页里面永远都是固定的东西--> <nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">
<img alt="Brand">
</a>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li>
<router-link to="/index">首页</router-link>
</li>
<li>
<router-link to="/micro">学位课</router-link>
</li>
<li>
<router-link to="/course">课程</router-link>
</li>
<li>
<router-link to="/news">深科技</router-link>
</li>
<li v-if=this.$store.state.username>
<span>欢迎 {{ this.$store.state.username }} 登录
<a @click="logout">注销</a>
</span>
</li>
<li v-else="">
<router-link to="/login">登录</router-link>
</li>
<!--{{ this.$store.state.username }}-->
</ul>
</div>
</div>
</nav>
<router-view></router-view> </div>
</template>
<script>
export default {
name: 'App',
methods: {
logout() {
this.$store.state.username = '';
this.$store.state.token = ''
}
}
}
</script>
<style> </style>

components --> Login.vue

<template>
<div class="container ">
<h2 class="modal-title">登录页面</h2>
<p></p>
<p></p>
<p></p>
<div class="form-group " >
<label for="1111" >
用户名
</label>
<input type="text" class="form-control " v-model="username" placeholder="username" id="1111">
</div>
<div class="form-group ">
<label for="">
密码
</label>
<input type="text" class="form-control " placeholder="password" v-model="password">
</div>
<p>
{{ msg }}
</p>
<button @click="DoLogin()" class="btn btn-success">提交</button>
</div>
</template> <script>
export default {
name: "Login",
data(){
return{
username:'',
password:'',
msg :''
}
},
methods:{
DoLogin(){
let _this = this;
this.$axios.request({
url:'http://127.0.0.1:8000/login/',
method:"POST",
data:{
"username": this.username,
"password": this.password
},
// responseType:'json',
}).then(function (res) {
window.console.log(res.data)
window.console.log(res.data.status)
if (res.data.status == 100){
_this.title = res.data;
_this.$store.commit('saveToken',res.data)
_this.$router.push('/index');
}else {
_this.msg = res.data.msg;
_this.$data.passowrd = ''
} })
}
}
}
</script> <style scoped> </style>

components -> index.vue

<template>

    <div class="row">
<h2>
{{ msg }}
</h2>
<div class="col-md-2">
<div style="background-color: #2aabd2">
1
</div>
</div>
<div style="width: 100%">
<div style="background-color: #8c8c8c">
2
</div>
</div> </div>
</template> <script>
export default {
name: "Index",
data() {
return {
msg: '这是首页'
}
}
}
</script> <style scoped> </style>

Vue 项目 Vue + restfulframework的更多相关文章

  1. vue-cli快速构建Vue项目

    vue-cli是什么? vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的. vue-cli怎么使用? 安装vue-cli之前,需要先装好vue 和 webpack npm i ...

  2. 如何搭建一个VUE项目

    搭建环境 搭建node环境 下载 1.进入node.js官方网站下载页,点击下图中框出位置,进行下载即可,当前版本为8.9.4,下载网址为:https://nodejs.org/zh-cn/downl ...

  3. 使用 vs code 搭建vue项目(一)

    1. 配置环境 1.1. 安装nodejs,下载地址:https://nodejs.org/en/download/. 步骤-..安装完成后,输入node-v,提示如下,则安装完成. 1.2. 安装v ...

  4. vue项目打包问题

    使用vue-cli脚手架构建vue项目 vue init webpack project npm run build 打包时出现 Tip: built files are meant to be se ...

  5. 快速搭建Vue项目

    快速搭建Vue项目 第一次安装vue项目Vue推荐开发环境Node.js 6.2.0.npm 3.8.9.webpack 1.13.vue-cli 2.5.1.webstrom2016 安装环境: 安 ...

  6. 创建一个vue 项目 必备的几个插件

    第一步npm安装 首先:先从nodejs.org中下载nodejs 打开控制命令行程序(CMD),node -v 检查是否正常 使用淘宝NPM 镜像 npm  install  -g  cnpm  - ...

  7. vue-cli快速构建vue项目模板

    vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的. 1.使用npm安装vue-cli 需要先装好vue 和 webpack(前提是已经安装了nodejs,否则连npm都用不了 ...

  8. 教你如何搭建vue项目

    笔者工作也有一些时间,需要用vue写项目时也总是项目组长已经把项目搭建好了, 偶尔心血来潮想试着自己搭建一个vue项目 我们搭建vue项目呢主要是用到了vue-cli来搭建,但是前提是必须要已经安装好 ...

  9. Linux下创建vue项目

    前提:已经安装了node.js.cnpm 1.全局安装vue脚手架vue-cli:#cnpm install -g vue-cli 注意:全局安装没有建立软链接前是无法使用刚刚安装的vue命令的,所以 ...

随机推荐

  1. 【转】【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件

    [转][完全开源]百度地图Web service API C#.NET版,带地图显示控件.导航控件.POI查找控件 目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET ...

  2. 图解HTTP系列

    第一章 第二章 第三章 第四章 第五章 第六章 第七章 第九章 第十章

  3. log4j-日志记录小结

    log4j.properties配置 ### 以系统输出流的方式按照指定的格式在控制台上输出日志信息 ###log4j.appender.stdout=org.apache.log4j.Console ...

  4. vue 导航守卫,验证是否登录

    路由跳转前,可以用导航守卫判断是否登录,如果登录了就正常跳转,没有登录就把路由指向登录页面. router.beforeEach((to, from, next) => { const next ...

  5. 2019.03.12 codeforces739E. Gosha is hunting(dp凸优化)

    传送门 题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi​,YYY道具移走第iii个道具概率为uiu_iui​. 对于每个物品每种道具最多 ...

  6. mysql 数据库链接 过期产品

    注意下面的"@" 必须要加的!否则会报错! $link = @mysql_connect('localhost','root','root') or die("link ...

  7. while read line 查找指定日期的文件夹

    #!/bin/bash dir=/root/tmp targetdir=/root/tmp/tmp filenametxt=/tmp/filename.txt commandtxt=/tmp/comm ...

  8. 回头来学习wpf的FlowDocument

    学习了一段时间的electron,其实是一个神奇的开发方式,让人神往.但其打印和ocx或是activeX方面还是让我不大放心去使用.毕竟当前首要任务还是window的应用开发. 于是重新学习wpf的F ...

  9. 重装win10+ubuntu 双系统 UEFI启动模式

    有较强的时效性!!先看一眼日期是否太古老! 任务 卸载双系统中的Ubuntu14,安装Ubuntu16 环境 操作系统: Win10 + Ubuntu14双系统 硬盘: 固态硬盘 + 机械硬盘,电脑的 ...

  10. Jquery 在子页面上设置父页面元素的值

    使用情景:因为我父页面上有用art.dialog,而子页面上有项目中的框架弹出方法跟art.dialog冲突,不能使用art.dialog自带的方法传值, 所以只好用一种简单粗暴的方法来设置. var ...