详解前后端分离之VueJS前端


Posted in Javascript onMay 24, 2017

前言

前端用什么框架都可以,这里选择小巧的vuejs。

要实现的功能很简单:

1、登录功能,成功将服务器返回的token存在本地

2、使用带token的header访问服务器的一个资源

本次实验环境:

"dependencies": {
  "vue": "^2.2.1"
 },
 "devDependencies": {
  "babel-core": "^6.0.0",
  "babel-loader": "^6.0.0",
  "babel-preset-latest": "^6.0.0",
  "cross-env": "^3.0.0",
  "css-loader": "^0.25.0",
  "file-loader": "^0.9.0",
  "vue-loader": "^11.1.4",
  "vue-template-compiler": "^2.2.1",
  "webpack": "^2.2.0",
  "webpack-dev-server": "^2.2.0"
 }

开发IDE:Atom

首先建一个项目

使用webpack构建

/Atom# vue init webpack-simple vue-jwt-demo
...
/Atom# cd vue-jwt-demo/
/Atom/vue-jwt-demo# cnpm install
/Atom/vue-jwt-demo# npm run dev

安装插件

/Atom/vue-jwt-demo# cnpm install vue-router

/Atom/vue-jwt-demo# cnpm install vue-resource

整体目录

详解前后端分离之VueJS前端

auth.js

完成token的存取

const SERVER_URL = 'http://localhost:8081'
const LOGIN_URL = SERVER_URL+'/login2'

export default{
  data:{
    authenticated:false
  },
  login(context,info){
    context.$http.post(LOGIN_URL,info).then(function(data){
      console.log(data.bodyText)
      localStorage.setItem('token',data.bodyText);
      this.authenticated = true
      //跳到home页
      this.$router.push('home')
    },function(err){
      console.log(err+","+err.body.message)
      context.error = err.body.message
    })
  },
  getAuthHeader(){
    return {
      'Authorization':'Bearer '+localStorage.getItem('token')
    }
  },
  checkAuth(){
    var token = localStorage.getItem('token')
    if(token){
      this.authenticated = true
    }else{
      this.authenticated = false
    }
  }
}

main.js

程序入口:完成路由和初始化

import Vue from 'vue'
import App from './App.vue'
import Login from './component/Login.vue'
import Home from './component/Home.vue'
import VueRouter from 'vue-router'
import VueResource from 'vue-resource'
import auth from './auth/auth'

Vue.use(VueRouter)
Vue.use(VueResource)

//在启动APP时进行校验是否有token
auth.checkAuth()

const routes= [
  {
    path:'/',redirect:'/login'
  },
  {
    path:'/login',component:Login
  },
  {
    path:'/home',component:Home
  }
]

const router = new VueRouter({
  routes
})
new Vue({
 router,
 render: h => h(App)
}).$mount('#app')

App.vue

页面载体

<template>
 <div id="app">
  <h1>{{msg}}</h1>
  <router-view></router-view>
 </div>
</template>

<script>
export default {
 name: 'app',
 data () {
  return {
   msg: 'Vue前后端分离demo'
  }
 }
}
</script>

Login.vue

登录页面

<template>
 <div>
  <h2>登录</h2>
  <p>{{ error }}</p>
  <div>
   <input
    type="text"
    placeholder="Enter your username"
    v-model="info.username"
   >
  </div>
  <div>
   <input
    type="password"
    placeholder="Enter your password"
    v-model="info.password"
   >
  </div>
  <button @click="submit()">登录</button>
 </div>
</template>

<script>
import auth from '../auth/auth'

export default {

 data() {
  return {
   info: {
    username: '',
    password: ''
   },
   error: ''
  }
 },
 methods: {
  submit() {
   var info = {
    username: this.info.username,
    password: this.info.password
   }
   auth.login(this, info)
  }
 }
}
</script>

效果:丑是丑了点

详解前后端分离之VueJS前端

Home.vue

主页面,访问一个获取邮箱的请求

<template>
 <div id="home">
  <h1>{{msg}}</h1>
  <button @click="getEmail()">Get Email</button>
  <h2>Email:{{email}}</h2>
 </div>
</template>

<script>
import auth from '../auth/auth'

export default {
 name: 'home',
 data () {
  return {
   msg: '欢迎您登录成功',
   email:''
  }
  },
  beforeCreate(){
    //如果没有token的话需要重新登录
     if(!auth.authenticated){
      this.$router.push('login')
    }
  },
  methods:{
    getEmail(){
      this.$http.get('http://localhost:8081/user/getEmail',{
        headers:auth.getAuthHeader()
      }).then(function(re){
        this.email = re.bodyText
      },function(){
        console.log("get email error")
      })
    }
  }
}
</script>

<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}

h1, h2 {
 font-weight: normal;
}

a {
 color: #42b983;
}
</style>

对应在服务端:

@GetMapping("/getEmail")
  public String getEmail() {
    return "xxxx@qq.com";
  }

详解前后端分离之VueJS前端

可看到浏览器的本地存储:

详解前后端分离之VueJS前端

代码:https://github.com/jimolonely/vue-jwt-demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
document.onreadystatechange事件的用法分析
Oct 17 Javascript
真正的JQuery.ajax传递中文参数的解决方法
May 28 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
May 07 Javascript
js一维数组、多维数组和对象的混合使用方法
Apr 03 Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 Javascript
AngularJS入门教程之双向绑定详解
Aug 18 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
Mar 29 Javascript
javascript编程实现栈的方法详解【经典数据结构】
Apr 11 Javascript
Angular2的管道Pipe的使用方法
Nov 07 Javascript
解决node修改后需频繁手动重启的问题
May 13 Javascript
js实现简单五子棋游戏
May 28 Javascript
JavaScript交换变量常用4种方法解析
Sep 02 Javascript
JQuery Ajax 异步操作之动态添加节点功能
May 24 #jQuery
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
May 24 #Javascript
使用jQuery.Pin垂直滚动时固定导航
May 24 #jQuery
bootstrap table使用入门基本用法
May 24 #Javascript
Vue动态实现评分效果
May 24 #Javascript
Angular.js指令学习中一些重要属性的用法教程
May 24 #Javascript
jquery append与appendTo方法比较
May 24 #jQuery
You might like
php生成缩略图的类代码
2008/10/02 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
用javascript作一个通用向导说明
2011/08/30 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
python实现八大排序算法(2)
2017/09/14 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
Python读取word文本操作详解
2018/01/22 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
多媒体专业自我鉴定
2014/02/28 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
英文导游词
2015/02/13 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技