vue+koa2+token上岸考证

koa2+vue

  • 用vue-cli搭建前端项目
  • 用koa2搭建背景,给前端供应数据接见接口

项目构造

《vue+koa2+token上岸考证》

  • 用vue-cli 搭建的项目,赤色框中是新建的文件夹用于寄存koa
  • 剩下的文件在写项目中逐步增添,最初就是如许的
  • 以后将项目跑起来,看一下有无题目(这里就当作没有题目)

前端

  • 这里选用Element-ui和vue搭配
  • 这里采纳的是element-UI的完全引入,假如小伙伴想用按需加载的话 参考按需引入
  • 上岸页面就不引见了 人人能够直接用(components/login.vue)
装置element-ui
    npm i element-ui -S
    
在src/main.js中引入
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    Vue.use(ElementUI);

上岸

  • 装置axios用于前背景的数据传输 npm install --save axios
  • 在main.js中设置全局的axios
  • 在src下新建一个axios文件夹,设置拦截器 和 全局地点 token
import axios from 'axios' // axios援用
import qs from 'qs'

// axios.defaults.baseURL = 'http://localhost:3000'; // 全局的地点,由于我的koa监听端口是3000, 这里能够根据人人本身的来设置
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;  //这是设置token
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
// 增加要求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送要求之前做些什么
  if(config.method === 'post'){
    config.data = qs.stringify(config.data)
  }
  return config;
}, function (error) {
  // 对要求毛病做些什么
  return Promise.reject(error);
});

// 增加相应拦截器
axios.interceptors.response.use(function (response) {
  // 对相应数据做点什么
  return response;
}, function (error) {
  // 对相应毛病做点什么
  return Promise.reject(error);
});

export default axios;
  • 在src下新建一个api文件夹,寄存接见背景的地点
import axios from 'axios';
export default{
  denglu: (data) => {
    return axios.post('/login', data)
  }
}

前端先告一段落,我们来设置背景接口

搭建koa2

进修koa

  • 装置koa2 koa-bodyparser koa-router koa2-cors npm install --save koa koa-bodyparser koa-router koa2-cors
  • [x] koa-bodyparser:用于吸收并剖析前台发送过来的post数据
  • [x] koa-router:路由
  • [x] koa2-cors:用来处置惩罚前端的跨域
  • 搭建koa 在浏览器运转localhost:3000 页面输出 hello 示意胜利了 😄

    下面的代码是考证koa是不是搭建胜利,能够跳过

const Koa = require('koa');
const bodyparser = require('koa-bodyparser');
    
const app = new Koa();
    
app.use(async (ctx) => {
  ctx.body = 'hello';
})
    
app.listen(3000);
  • 接下来 最先搭建koa的路由
const Koa = require('koa'); 
const bodyparser = require('koa-bodyparser');
const router = require('koa-router')();
const login = require('./router/login.js');     //这是上岸路由的文件
const cors = require('koa2-cors');
const app = new Koa();
app.use(bodyparser())
这是处置惩罚前端跨域的设置
app.use(cors({
  origin: function (ctx) {
    if (ctx.url === '/login') {
      return "*"; // 许可来自一切域名要求
    }
    return 'http://localhost:8080';
  },
  exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
  maxAge: 5,
  credentials: true,
  allowMethods: ['GET', 'POST', 'DELETE'],
  allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
}));
    
router.use('/login',login);   //将路由提取出去便于管理
app
  .use(router.routes())
  .use(router.allowedMethods());
app.listen(3000);
  • 接下来就是去设置上岸的路由
const router = require('koa-router')();

router
  .post('/', async ctx => {
    ctx.body = {  //这是向前台返回的数据 由于没有衔接数据库所以我们本身定义,背面讲衔接数据库
      user:'111',
      code:1,
      status:200
    };
  });

module.exports = router.routes();
  • 接下来 进入src/axios下的文件翻开 将解释的代码摊开
axios.defaults.baseURL = 'http://localhost:3000'; // 全局的地点,由于我的koa监听端口是3000, 这里能够根据人人本身的来设置

ok 我们开测试一下

能够用postmain 也能够直接在浏览器中测试

postmain

《vue+koa2+token上岸考证》

chrome浏览器 直接在浏览器中测试

《vue+koa2+token上岸考证》

能取到数据 那就申明没有题目
接下来最先衔接数据库 数据库用的是 mysql

建立数据库

  • 我在当地用的是mamp+navicat 人人能够用本身熟习的
  • 装置mysql-pro 一个衔接数据库的中间件npm install mysql-pro
  • 接下来在建立表
  • 须要的字段

    | id | user | pass |
    | — | — | — |

    《vue+koa2+token上岸考证》

  • 随意增加两个就能够了,这里没有做考证,须要的小伙伴能够本身增加这个功用
  • 到此就完毕了,我们来考证一下
  • 在koa2/sql下新建一个js文件

    const Client = require('mysql-pro');
    const db = new Client({
      mysql:{
        host:'localhost',
        port:3306,
        database:'vue-koa2',
        user:'root',
        password:'root'
      }
    })
    
    module.exports = db;
  • 接下来进入koa2/router下的login.js
  • 看一下我们在前端拿到的数据

    《vue+koa2+token上岸考证》
    由于我们用了中间件koa-bodyparser ,在koa2/router/login.js中如许写

    const router = require('koa-router')();
       const db = require('../sql/sql');
       
       router
     .post('/', async ctx => {
       let user = ctx.request.body   //吸收前端传过来的post数据
       console.log(user);
       ctx.body = {
         user:'111',
         code:1,
         status:200
       };
     });
       
       module.exports = router.routes();
    控制台输出 { user: '123', pass: '123' }
    

接下来衔接数据数据库,查询

const router = require('koa-router')();
const db = require('../sql/sql');

router
  .post('/', async ctx => {
    let user = ctx.request.body.user;
    let pass = ctx.request.body.pass;
    // 将吸收到的前台数据和数据库中的数据婚配
    // 假如婚配胜利 返回status 200 code 1
    // 不胜利返回status 1000 code 0
    db.query('select * from login where user=? and pass=?;',[user,pass]).then(res => {
      console.log(res);
    })
    ctx.body = {
      user:'111',
      code:1,
      status:200
    };
  });

module.exports = router.routes();

控制台输出[ RowDataPacket { id: 1, user: '111', pass: '111' } ]
示意拿到数据
注重

这是个数组的花样,假如将user返回给前端`res[0].user`,
const router = require('koa-router')();
const db = require('../sql/sql');

router
  .post('/', async ctx => {
    let user = ctx.request.body.user;
    let pass = ctx.request.body.pass;
    // 将吸收到的前台数据和数据库中的数据婚配
    // 假如婚配胜利 返回status 200 code 1
    // 不胜利返回status 1000 code 0
    await db.query('select * from login where user=? and pass=?;', [user, pass]).then(res => {
      if (res.length === 0) {   // 数据库中没有婚配到用户
        ctx.body = {
          code: 0,
          status: 1000,
          msg: 'error'
        }
      } else {  //婚配到用户
        ctx.body = {
          user: res[0].user,
          code: 1,
          status: 200
        }
      }
    })

  });

module.exports = router.routes();

以上就是简朴的前后数据交互
接下来解说的是vuex权限考证和token

token

addtoken

const jwt = require('jsonwebtoken');
const serect = 'token';  //密钥,不能丢
module.exports = (userinfo) => { //建立token并导出
  const token = jwt.sign({
    user: userinfo.user,
    id: userinfo.id
  }, serect, {expiresIn: '1h'});
  return token;
};

在router/login中引入

const router = require('koa-router')();
    const db = require('../sql/sql');
    const addtoken = require('../token/addtoken');
    
    router
      .post('/', async ctx => {
        let user = ctx.request.body.user;
        let pass = ctx.request.body.pass;
        // 将吸收到的前台数据和数据库中的数据婚配
        // 假如婚配胜利 返回status 200 code 1
        // 不胜利返回status 1000 code 0
        await db.query('select * from login where user=? and pass=?;', [user, pass]).then(res => {
          if (res.length === 0) {   // 数据库中没有婚配到用户
            ctx.body = {
              code: 0,
              status: 1000,
              msg: 'error'
            }
          } else {  //婚配到用户
            let tk = addtoken({user:res[0].user,id:res[0].id})  //token中要照顾的信息,本身定义
            ctx.body = {
              tk,  //返回给前端
              user: res[0].user,
              code: 1,
              status: 200
            }
          }
        })
    
      });
    module.exports = router.routes();

vuex

拿到了背景的token,我们要做什么呢?

  1. 存到localStorage中

    • 在src/components/login.vue中将token和user存进localStorage中
  2. 存到vuex中

    • npm install –save vuex

这看本身的需求了
回到前端 我们改一下路由

没改之前

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'login',
      component: resolve => require(['@/components/login'],resolve)
    },
    {
      path: '/homes',
      name: 'homes',
      component: resolve => require(['@/components/homes'],resolve)
    }
  ]
})

悛改以后

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router);

const router = new Router({
  routes: [
    {
      path: '/',
      name: 'login',
      component: resolve => require(['@/components/login'], resolve)
    },
    {
      path: '/homes',
      name: 'homes',
      meta: {
        auth: true
      },
      component: resolve => require(['@/components/homes'], resolve)
    }
  ]
});

router.beforeEach((to, from, next) => {
  if (to.meta.auth) { //权限推断
    if ('举行推断') { //读取token值
    //  胜利
      next()
    } else {
      next({path:'/'})
    }
  } else {
    // 没有meta.auth 不必管
    next()
  }
});

export default router;

在路由中要考证的处所增加meta:{auth:true}

接下来就是建立vuex

  1. 在src下新建文件夹vuex
  2. 全局引入vuex
  3. 在vuex中新建store.js文件

    import Vue from ‘vue’;
    import Vuex from ‘vuex’
    Vue.use(Vuex);

    const store = new Vuex.Store({
    state:{

    user:localStorage.getItem('user') || '',
    token:localStorage.getItem('token') || null

    }
    });
    export default store;

  4. 接下来改一下路由中的权限推断

    router.beforeEach((to, from, next) => {
    if (to.meta.auth) { //权限推断

    if (localStorage.getItem('token')) { //读取token值
    //  胜利
      next()
    } else {
      next({path:'/'})
    }

    } else {

    // 没有meta.auth 不必管
    next()

    }
    });

在login.vue中吸收到数据后增加

    localStorage.setItem('token', data.data.tk) //存储token
    localStorage.setItem('user', data.data.user) //存储用户
    this.LOGIN({
      token:data.data.tk,
      user:data.data.user
    });
    
  1. 如许就将token拿到了并存进localStorage中,接下来就是将token在发送的时刻 增加进头部中 发送给背景
  2. 在axios/axios.js中

    axios.defaults.headers.common[‘Authorization’] = ‘Bearer ‘+ localStorage.getItem(‘token’);

  3. 在上岸的时刻如许就会将token发送给背景了
  4. 背景考证前台发送的token

    const jwt = require(‘jsonwebtoken’);
    const serect = ‘token’; //密钥,不能丢
    module.exports =(tokens) => {

    if (tokens){

    let toke = tokens.split(' ')[1];
    // 剖析
    let decoded = jwt.decode(toke, serect);
    return decoded;

    }
    };

  5. 在login.js中,增加

    router.get(‘/test’,async (ctx,next) => {
    let token = ctx.request.header.authorization;
    if (token){
    // 获取到token
    let res = proving(token);

    if (res && res.exp <= new Date()/1000){
      ctx.body = {
        message: 'token逾期',
        code:3
      };
    } else {
      ctx.body = {
        message: '剖析胜利',
        code:1
      }
    }

    } else{ // 没有取到token
    ctx.body = {

    msg:'没有token',
    code:0
      }
     }
    });
    

项目至此算是告一段落,人人能够把我的项目clone到当地下运转
项目地点

项目中或许有许多写的不对的处所,或许不范例什么的 人人就引以为戒,

    原文作者:seven
    原文地址: https://segmentfault.com/a/1190000017379244
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞