Vue 项目 Vue + restfulframework

实现登录认证

- django

views

  1. class MyResponse():
  2. def __init__(self):
  3. self.status = 100
  4. self.msg = None
  5. @property
  6. def get_dic(self):
  7. return self.__dict__
  8. #token
  9. def get_token(username):
  10. import hashlib
  11. import time
  12. md = hashlib.md5()
  13. # update内必须传bytes格式
  14. md.update(username.encode('utf-8'))
  15. md.update(str(time.time()).encode('utf-8'))
  16. return md.hexdigest()
  17. #认证
  18. class Login(APIView):
  19. authentication_classes = []
  20. def post(self, request):
  21. response = MyResponse()
  22. name = request.data.get('username')
  23. pwd = request.data.get('password')
  24. user = models.User.objects.filter(username=name, password=pwd).first()
  25. print(name,pwd)
  26. name1 =request.GET.get('username')
  27. print(name1)
  28. if user:
  29. response.msg = '登陆成功'
  30. response.username = name
  31. # 登陆成功,返回一个随机字符串,以后在发请求,都携带这个字符串
  32. token = get_token(name)
  33. response.token = token
  34. # 把随机字符串保存到数据库,有就更新,没有就创建
  35. # ret=models.UserToken.objects.update_or_create(user_id=user.id,kwargs={'token':token})
  36. ret = models.UserToken.objects.update_or_create(user=user, defaults={'token': token})
  37. else:
  38. response.msg = '用户名或密码错误'
  39. response.status = 101
  40. obj = JsonResponse(response.get_dic)
  41. obj['Access-Control-Allow-Origin']='*'
  42. return obj
  43. #解决跨域问题 中间件
  44. from django.utils.deprecation import MiddlewareMixin
  45. class CorsMiddleWare(MiddlewareMixin):
  46. def process_response(self,request,response):
  47. if request.method=="OPTIONS":
  48. print(111)
  49. #不能加*
  50. response["Access-Control-Allow-Headers"]="*"
  51. response["Access-Control-Allow-Origin"] = "*"
  52. response['Access-Control-Allow-Methods'] = 'POST'
  53. return response

setting

  1. 把中间件添加到setting的配置中
  2. 注释csrftoken认证
  3. MIDDLEWARE = [
  4. 'app01.views.CorsMiddleWare',
  5. 'django.middleware.security.SecurityMiddleware',
  6. 'django.contrib.sessions.middleware.SessionMiddleware',
  7. 'django.middleware.common.CommonMiddleware',
  8. # 'django.middleware.csrf.CsrfViewMiddleware',
  9. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  10. 'django.contrib.messages.middleware.MessageMiddleware',
  11. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  12. ]

urls

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

- Vue

安装包

cnpm install --save axios vuex

npm install vue-cookie --save

route.js

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Home from './views/Home.vue'
  4. import Index from '../src/components/index.vue'
  5. // import Login from '../src/components/Login.vue'
  6. Vue.use(Router);
  7. export default new Router({
  8. mode: 'history',
  9. base: process.env.BASE_URL,
  10. routes: [
  11. {
  12. path: '/',
  13. name: 'home',
  14. component: Home
  15. },
  16. {
  17. path: '/index',
  18. name: 'Index',
  19. // route level code-splitting
  20. // this generates a separate chunk (about.[hash].js) for this route
  21. // which is lazy-loaded when the route is visited.
  22. // 两种都可以,要不上面导入进来,或者直接定vue组件的路径
  23. // component: () => import(/* webpackChunkName: "about" */ '../src/components/index.vue')
  24. component:Index
  25. },
  26. {
  27. path: '/login',
  28. name: 'Login',
  29. // route level code-splitting
  30. // this generates a separate chunk (about.[hash].js) for this route
  31. // which is lazy-loaded when the route is visited.
  32. component: () => import(/* webpackChunkName: "about" */ '../src/components/Login.vue')
  33. }
  34. ]
  35. })

store.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import Cookie from 'vue-cookies'
  4. Vue.use(Vuex);
  5. export default new Vuex.Store({
  6. state: {
  7. username:Cookie.get('username'),
  8. token:Cookie.get('token')
  9. // Cookie.get('username') Cookie.get('token')
  10. },
  11. mutations: {
  12. //组件中通过this.$store.commit(参数)调用
  13. saveToken (state,data) {
  14. state.username = data.username;
  15. state.token = data.token;
  16. Cookie.set('username',data.username,'1min');
  17. Cookie.set('token',data.token,'1min')
  18. },
  19. //清空token和cookie
  20. clearToken (state) {
  21. state.username = null;
  22. state.token = null;
  23. Cookie.remove('username');
  24. Cookie.remove('token')
  25. }
  26. },
  27. actions: {
  28. }
  29. })

main.js

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. import router from './router'
  4. import store from './store'
  5. import Axios from 'axios'
  6. import VueCookie from 'vue-cookies'
  7. // import 'bootstrap/dist/css/bootstrap.css'
  8. Vue.prototype.$axios = Axios;
  9. Vue.prototype.$Cookies = VueCookie;
  10. Vue.config.productionTip = false;
  11. new Vue({
  12. router,
  13. store,
  14. render: h => h(App)
  15. }).$mount('#app');

App.vue

  1. <template>
  2. <div>
  3. <!--首页里面永远都是固定的东西-->
  4. <nav class="navbar navbar-default">
  5. <div class="container-fluid">
  6. <div class="navbar-header">
  7. <a class="navbar-brand" href="#">
  8. <img alt="Brand">
  9. </a>
  10. </div>
  11. <div class="collapse navbar-collapse">
  12. <ul class="nav navbar-nav">
  13. <li>
  14. <router-link to="/index">首页</router-link>
  15. </li>
  16. <li>
  17. <router-link to="/micro">学位课</router-link>
  18. </li>
  19. <li>
  20. <router-link to="/course">课程</router-link>
  21. </li>
  22. <li>
  23. <router-link to="/news">深科技</router-link>
  24. </li>
  25. <li v-if=this.$store.state.username>
  26. <span>欢迎 {{ this.$store.state.username }} 登录
  27. <a @click="logout">注销</a>
  28. </span>
  29. </li>
  30. <li v-else="">
  31. <router-link to="/login">登录</router-link>
  32. </li>
  33. <!--{{ this.$store.state.username }}-->
  34. </ul>
  35. </div>
  36. </div>
  37. </nav>
  38. <router-view></router-view>
  39. </div>
  40. </template>
  41. <script>
  42. export default {
  43. name: 'App',
  44. methods: {
  45. logout() {
  46. this.$store.state.username = '';
  47. this.$store.state.token = ''
  48. }
  49. }
  50. }
  51. </script>
  52. <style>
  53. </style>

components --> Login.vue

  1. <template>
  2. <div class="container ">
  3. <h2 class="modal-title">登录页面</h2>
  4. <p></p>
  5. <p></p>
  6. <p></p>
  7. <div class="form-group " >
  8. <label for="1111" >
  9. 用户名
  10. </label>
  11. <input type="text" class="form-control " v-model="username" placeholder="username" id="1111">
  12. </div>
  13. <div class="form-group ">
  14. <label for="">
  15. 密码
  16. </label>
  17. <input type="text" class="form-control " placeholder="password" v-model="password">
  18. </div>
  19. <p>
  20. {{ msg }}
  21. </p>
  22. <button @click="DoLogin()" class="btn btn-success">提交</button>
  23. </div>
  24. </template>
  25. <script>
  26. export default {
  27. name: "Login",
  28. data(){
  29. return{
  30. username:'',
  31. password:'',
  32. msg :''
  33. }
  34. },
  35. methods:{
  36. DoLogin(){
  37. let _this = this;
  38. this.$axios.request({
  39. url:'http://127.0.0.1:8000/login/',
  40. method:"POST",
  41. data:{
  42. "username": this.username,
  43. "password": this.password
  44. },
  45. // responseType:'json',
  46. }).then(function (res) {
  47. window.console.log(res.data)
  48. window.console.log(res.data.status)
  49. if (res.data.status == 100){
  50. _this.title = res.data;
  51. _this.$store.commit('saveToken',res.data)
  52. _this.$router.push('/index');
  53. }else {
  54. _this.msg = res.data.msg;
  55. _this.$data.passowrd = ''
  56. }
  57. })
  58. }
  59. }
  60. }
  61. </script>
  62. <style scoped>
  63. </style>

components -> index.vue

  1. <template>
  2. <div class="row">
  3. <h2>
  4. {{ msg }}
  5. </h2>
  6. <div class="col-md-2">
  7. <div style="background-color: #2aabd2">
  8. 1
  9. </div>
  10. </div>
  11. <div style="width: 100%">
  12. <div style="background-color: #8c8c8c">
  13. 2
  14. </div>
  15. </div>
  16. </div>
  17. </template>
  18. <script>
  19. export default {
  20. name: "Index",
  21. data() {
  22. return {
  23. msg: '这是首页'
  24. }
  25. }
  26. }
  27. </script>
  28. <style scoped>
  29. </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. mk文件配置第三方jar包,so文件

    #-------------------------配置jar包--------------------- LOCAL_STATIC_JAVA_LIBRARIES := \ libphonenumbe ...

  2. python 练习4

    题目为信用卡消费管理系统: 主程序:main.py #!usr/bin/env python # encoding: utf-8 import conf,sys,time,re,os import j ...

  3. 采用Google预训bert实现中文NER任务

    本博文介绍用Google pre-training的bert(Bidirectional Encoder Representational from Transformers)做中文NER(Name ...

  4. 走进JDK(十一)------LinkedHashMap

    概述LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,LinkedHas ...

  5. Codeforces Round #536 (Div. 2) F 矩阵快速幂 + bsgs(新坑) + exgcd(新坑) + 欧拉降幂

    https://codeforces.com/contest/1106/problem/F 题意 数列公式为\(f_i=(f^{b_1}_{i-1}*f^{b_2}_{i-2}*...*f^{b_k} ...

  6. temp--内蒙农信(环境)

    规章制度篇: 1, 内蒙农信办公地址:    呼和浩特市赛罕区内蒙古自治区农村信用社联合社(陶利街) 农金大厦1201室. 2, 电子版蓝底照片(办饭卡,自己充钱) , 行里面吃饭标准  早餐8元.午 ...

  7. ajax动态刷新的元素,导致绑定事件失效

    jquery事件绑定有2种方式: 1,普通事件绑定: $('元素').click(function(){}); 2, 事件代理或者叫事件委托 $('#chatPanelList').on('click ...

  8. 如何下载官网上下载历史Java版本(老版本Java)

    首先先打开Oracle的官网    -->Oracle 然后选择Trials and Downloads 然后往下翻,选择java(JDK) 然后看到了这个,再往下翻 点他,然后就是选择你想下载 ...

  9. MQTT

    1.IBM提出,适用于IOT,订阅和发布模式. 2.订阅和发布模式:这种模式是异步的形式,有些类似于邮件接发的形式,发送者将邮件发至代理,接收者如果没同时接收,也不影响发送者的二次发送. 3.主题模式 ...

  10. 12 week work

    调用一个地图API <html> <head> <meta http-equiv="Content-Type" content="text/ ...