详解前后端分离之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 相关文章推荐
JS扩展方法实例分析
Apr 15 Javascript
jQuery获取上传文件的名称的正则表达式
May 21 Javascript
谈谈Jquery中的children find 的区别有哪些
Oct 19 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
May 20 Javascript
JS操作JSON方法总结(推荐)
Jun 14 Javascript
在html中引入外部js文件,并调用带参函数的方法
Oct 31 Javascript
javascript入门之string对象【新手必看】
Nov 22 Javascript
js模糊查询实例分享
Dec 26 Javascript
jQuery实现别踩白块儿网页版小游戏
Jan 18 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
Feb 28 Javascript
详解如何在nuxt中添加proxyTable代理
Aug 10 Javascript
Vue页面刷新记住页面状态的实现
Dec 27 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
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
jquery插件开发模式实例详解
2019/07/20 jQuery
vue实现全匹配搜索列表内容
2019/09/26 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
通过angular CDK实现页面元素拖放的步骤详解
2020/07/01 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
python实现逻辑回归的示例
2020/10/09 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
别名指示符是什么
2012/10/08 面试题
幼儿园中班评语大全
2014/04/17 职场文书
考试诚信承诺书
2014/05/23 职场文书
2014年班组工作总结
2014/11/20 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
亮剑观后感600字
2015/06/05 职场文书
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL