详解前后端分离之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下4个跨浏览器必备的函数
Mar 07 Javascript
javascript中xml操作实现代码
Nov 21 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
Jun 14 Javascript
javascript中取前n天日期的两种方法分享
Jan 26 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
Feb 20 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
Jan 24 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
May 13 Javascript
浅谈JavaScript的计时器对象
Dec 26 Javascript
JS小数转换为整数的方法分析
Jan 07 Javascript
vue的一个分页组件的示例代码
Dec 25 Javascript
Element ui 下拉多选时新增一个选择所有的选项
Aug 21 Javascript
微信小程序工具函数封装
Oct 28 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添加Redis模块及连接
2015/07/28 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
js表头排序实现方法
2015/01/16 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
2017/10/19 jQuery
js中时间格式化的几种方法
2018/07/22 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
python调用cmd命令行制作刷博器
2014/01/13 Python
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
Python 制作糗事百科爬虫实例
2016/09/22 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
计算机专业毕业生的自我评价
2013/11/18 职场文书
关于爱国的标语
2014/06/24 职场文书
商场周年庆活动方案
2014/08/19 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
学校2014年度工作总结
2014/12/06 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
Python测试框架pytest高阶用法全面详解
2022/06/01 Python