详解vue2.0+axios+mock+axios-mock+adapter实现登陆


Posted in Javascript onJuly 19, 2018

做项目过程中,需要用到后台模拟数据,在机缘巧合下发现了mock,在学习使用的过程中又偶遇了axios-mock-adapter。现在将实例展示如下:

1、准备

实例是建立在vue-cli的基础上实现

需要提前安装的插件有:

axios:npm install axio --save

mockjs:npm install mockjd --save-dev

axios-mock-adapter:npm install axios-mock-adapter --save-dev

引入

第一种引入方式:按照es6的语法,以import的方式引入

import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';

第二种引入方式:以require方式引入

var axios = require('axios');
var MockAdapter = require('axios-mock-adapter');

代码实例

整个项目的代码结构如下:

详解vue2.0+axios+mock+axios-mock+adapter实现登陆

首先新建一个login.vue文件,代码如下

<template>

 <el-form 
  class="login-container" 
  ref="AccountForm" 
  :model="account" 
  :rules="loginRules" 
  label-position="left">
  <h3>Login</h3>
  <el-form-item prop="username">
   <el-input 
     v-model="account.username" 
     type="text" 
     placeholder="账号">
   </el-input>
  </el-form-item>
  <el-form-item prop="password">
   <el-input v-model="account.password" type="password" placeholder="密码"></el-input>
  </el-form-item>
  <el-checkbox v-model="checked" checked>记住密码</el-checkbox>
  <el-form-item>
   <el-button type="primary">login</el-button>
   <el-button type="primary">reset</el-button>
  </el-form-item>
 </el-form>

</template>

<script>
 import {requseLogin} from "../axios/api";

 export default {
  name: "login",
  data () {
   return {
    account: {
     username: '',
     password: ''
    },
    loginRules: {
     username: [{required: true, message: '请输入账号', trigger: 'blur'}],
     password: [{required: true,message: '请输入密码', trigger: 'blur'}],
    },
    checked: true,
    logining: false
   };
  },
  methods: {}
</script>

<style scoped>
 body{
  background: #DFE9FB;
 }
.login-container {
 width:350px;
 margin-left:35%;
 border: 1px solid #d3d3d3;
 box-sizing: border-box;
 padding: 10px 30px;
 border-radius: 5px;
}
 .el-button {
  width:100%;
  box-sizing: border-box;
  margin: 10px 0;
 }
</style>

由于路由的默认指向是HelloWorld,所以修改router文件夹下的index.js

import Vue from 'vue'
import Router from 'vue-router'
 
// 懒加载方式,当路由被访问的时候才加载对应组件
const Login = resolve => require(['@/components/Login'], resolve)
 
Vue.use(Router)
 
export default new Router({
  routes: [{
    path: '/',
    name: 'login',
    component: Login
  }]

此时登录界面样式基本写好,接下来修改main.js,将需要引入的文件引入

如下:

import Vue from 'vue'
import App from './App'
import router from './router'

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

import axios from 'axios'
Vue.prototype.$ajax = axios
// axios不能直接使用use引入,只能每个需要发送请求的组件中即时引入,两种引入方式
// 第一种引入方式:引入axios后,修改原型链
// import axios from 'axios'
// Vue.prototype.$axios = axios

Vue.config.productionTip = false;
Vue.use(ElementUI);


/* eslint-disable no-new */
new Vue({
 el: '#app',
 router,
 store, // 使用store
 components: { App },
 template: '<App/>'
})

刷新页面

详解vue2.0+axios+mock+axios-mock+adapter实现登陆

接下来就是对login.vue页面进行改造:增加登录点击事件和重置事件

<el-form-item>
   <el-button @click.native.prevent="handleLogin" :loading="logining" type="primary">login</el-button>
   <el-button
    type="primary"
    class="resetBtn"
    @click.native.prevent="reset">
    reset
   </el-button>
  </el-form-item>

此时的点击事件没有交互功能,使用axios和mock.js实现交互,并且使用axios-mock-adapter进行axios数据调试

在src下新建一个axios文件夹,并建一个api.js

import axios from 'axios'

axios.defaults.baseURL = 'http://127.0.0.1:80';

export const requseLogin = params => {
 return axios.post('/user/login', params);
}

再新建一个index.js

import * as api from './api'

export default api

这是像后台发起post请求,地址是‘user/login'

此处的后台数据我们使用mockjs进行拦截,然后模拟后台服务返回的数据

创建mock后台模拟数据

在src目录下创建mock文件夹,并且新建一个index.js,index.js内容如下:、

// 通过axios-mock-adapter生成代理api地址
import axios from 'axios'
import MockAdapter from 'axios-mock-adapter'

// import { LoginUsers } from './data/user'
import {users} from './data/user'

export default {
 init() {
  let mock = new MockAdapter(axios);

  // mock success request 模拟成功请求
  mock.onGet('/success').reply(200, {
   msg: 'success'
  });
  // mock error request 模拟失败请求
  mock.onGet('/error').reply(500, {
   msg: 'failure'
  })

  // login 模拟登录接口
  mock.onPost('/user/login').reply(config => {
   // 解析axios传过来的数据
   let { username, password } = JSON.parse(config.data);
   return new Promise((resolve, reject) => {
    // 先创建一个用户为空对象
    let user = null;
    setTimeout(() => {
     // 判断模拟的假数据中是否有和传过来的数据匹配的
     let hasUser = users.some(person => {
      // 如果存在这样的数据
      if (person.username === username && person.password === password) {
       user = JSON.parse(JSON.stringify(person));
       user.password = undefined;
       return true;
      }else {
       // 如果没有这个person
       return false
      }
     });
     // 如果有那么一个人
     if (hasUser) {
      resolve([ 200, {code: 200, msg: '登录成功',user} ]);
     } else { // 如果没有这么一个人
      resolve([ 200, {code: 500, msg: '账号错误' }])
     }
    }, 500);
   })
  });
 // 模拟注册接口
 }
}

接着在mock下建立data文件夹,;里面新建user.js用来存放用户信息

/*
* 用来存放一些模拟用户的数据
* */

// import Mock from 'mockjs'
const users = [
 {
  id: 1,
  username: 'admin',
  password: '123456',
  email: '123456@qq.com',
  name: '搬砖者'
 },
 {
  id: 2,
  username: 'lytton',
  password: '123456',
  email: 'yyyyy@163.com',
  name: '混子'
 }
]

export { users }

为login.vue文件增加登录方法

<script>
 import {requseLogin} from "../axios/api";

 export default {
  name: "login",
  data () {
   return {
    account: {
     username: '',
     password: ''
    },
    loginRules: {
     username: [{required: true, message: '请输入账号', trigger: 'blur'}],
     password: [{required: true,message: '请输入密码', trigger: 'blur'}],
    },
    checked: true,
    logining: false
   };
  },
  methods: {
   handleLogin() {
    this.$refs.AccountForm.validate((valid) => {
     if (valid) {
      this.logining = true;
      let loginParams = {
       username: this.account.username,
       password: this.account.password
      }
      // 调用axios登录接口
      requseLogin(loginParams).then(res => {
       // debugger;
       this.logining = false;
       // 根据返回的code判断是否成功
       let { code, msg, user } = res.data;
       if (code === 200) {
        // elementui中提示组件
        this.$message({
         type: 'success',
         message: msg
        });
        // 登陆成功,用户信息就保存在sessionStorage中
        sessionStorage.setItem('user', JSON.stringify(user));
        // 跳转到后台主页面
        console.log('this',this)
        this.$router.push({ path: '/home' })

       }else {
        this.$message({
         type: 'error',
         message: msg,
        });
       }
      }).catch(err =>{
       console.log(err);
      });
     }else {
      console.log('error submit!');
      return false;
     }
    })
   },
   reset () {
    this.$refs.AccountForm.resetFields()
   },
  }
  }
</script>

当点击登录按钮后,跳转到‘/home'页面,在components文件夹下面新增home.vue文件

<template>
 <div >
  <h1>{{ msg }}</h1>
  
 </div>
</template>
<script>
export default {
 name: '后台主界面',
 data () {
  return {
   msg: '后台主界面'
  }
 }
}
</script>

接下了修改router中的index.js

import Vue from 'vue'
import Router from 'vue-router'
// import HelloWorld from '@/components/HelloWorld'
// import Home from '../components/home';

// 懒加载方式,当路由被访问的时候才加载对应组件
const Login = resolve => require(['@/components/Login'], resolve)
const Home = resolve => require(['@/components/home'], resolve)

Vue.use(Router)

const router = new Router({
 routes: [
  {
   path: '/',
   name: 'login',
   component: Login
  },
  {
   path: '/login',
   name: 'login',
   component: Login
  },
  {
   path: '/home',
   name: 'home',
   component: Home
  }
 ]
})

// 访问之前,检查是否登陆了
router.beforeEach((to, from, next) => {
 if(to.path.startsWith('/login')) {
  window.sessionStorage.removeItem('user');
  next()
 }else {
  let token = window.sessionStorage.getItem('user');
  if (!token) {
   next({path: '/login'})
  }else {
   next()
  }
 }
});
export default router

在main.js中引入mock

import Vue from 'vue'
import Router from 'vue-router'
// import HelloWorld from '@/components/HelloWorld'
// import Home from '../components/home';

// 懒加载方式,当路由被访问的时候才加载对应组件
const Login = resolve => require(['@/components/Login'], resolve)
const Home = resolve => require(['@/components/home'], resolve)

Vue.use(Router)

const router = new Router({
 routes: [
  {
   path: '/',
   name: 'login',
   component: Login
  },
  {
   path: '/login',
   name: 'login',
   component: Login
  },
  {
   path: '/home',
   name: 'home',
   component: Home
  }
 ]
})

// 访问之前,检查是否登陆了
router.beforeEach((to, from, next) => {
 if(to.path.startsWith('/login')) {
  window.sessionStorage.removeItem('user');
  next()
 }else {
  let token = window.sessionStorage.getItem('user');
  if (!token) {
   next({path: '/login'})
  }else {
   next()
  }
 }
});
export default router

至此,运行npm run dev即可

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

Javascript 相关文章推荐
JSON 入门指南 想了解json的朋友可以看下
Aug 26 Javascript
JavaScript 参数中的数组展开 [译]
Sep 21 Javascript
JS实现div居中示例
Apr 17 Javascript
JavaScript将数字转换成大写中文的方法
Mar 23 Javascript
JS实现的Select三级下拉菜单代码
Aug 20 Javascript
js焦点文字滚动效果代码分享
Aug 25 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
Jun 21 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 Javascript
jquery实现直播弹幕效果
Nov 28 jQuery
基于canvas实现手写签名(vue)
May 21 Javascript
vant实现购物车功能
Jun 29 Javascript
微信小程序自定义胶囊样式
Dec 27 Javascript
微信小程序实现分享到朋友圈功能
Jul 19 #Javascript
微信小程序实现自定义加载图标功能
Jul 19 #Javascript
Angular5集成eventbus的示例代码
Jul 19 #Javascript
微信小程序实现弹出菜单
Jul 19 #Javascript
微信小程序实现之手势锁功能实例代码
Jul 19 #Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 #Javascript
微信小程序实现折叠展开效果
Jul 19 #Javascript
You might like
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
基于jQuery的获取标签名的代码
2012/07/16 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
python计算最大优先级队列实例
2013/12/18 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
python按比例随机切分数据的实现
2019/07/11 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
汽车专业人才自我鉴定范文
2013/12/29 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
2015年毕业生个人自荐书
2015/03/24 职场文书
商务司机岗位职责
2015/04/10 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript
Go 内联优化让程序员爱不释手
2022/06/21 Golang
app场景下uniapp的扫码记录
2022/07/23 Java/Android
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js