详解前后端分离之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 相关文章推荐
javascript检测页面是否缩放的小例子
May 16 Javascript
JS限制Textarea文本域字符个数的具体实现
Aug 02 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
Mar 11 Javascript
JavaScript中用let语句声明作用域的用法讲解
May 20 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
Jun 27 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
Nov 28 Javascript
Angular.js自定义指令学习笔记实例
Feb 24 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
Jul 08 jQuery
ajax请求data遇到的问题分析
Jan 18 Javascript
Node.js搭建WEB服务器的示例代码
Aug 15 Javascript
vue 二维码长按保存和复制内容操作
Sep 22 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
Feb 06 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基础学习小结
2011/04/17 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
laravel model 两表联查示例
2019/10/24 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
javascript回调函数详解
2018/02/06 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Python实现包含min函数的栈
2016/04/29 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
浅析Python __name__ 是什么
2020/07/07 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
技校生自我鉴定范文
2013/09/26 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
横幅标语大全
2014/06/17 职场文书
高三毕业评语
2014/12/31 职场文书
发布会邀请函
2015/01/31 职场文书
刑事附带民事代理词
2015/05/25 职场文书
雷锋之歌观后感
2015/06/10 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
python基础之函数的定义和调用
2021/10/24 Python
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js
Django框架中表单的用法
2022/06/10 Python