Niffler

X2.13 16340246-Vue+mockjs+axios实现模拟与后端进行数据交互

Posted By 16340246

在前后端分离的单页面应用项目开发的过程中,我们常常需要与后端发生交互,以调试我们的程序。但是,如果后端接口还没有开发完成,我们该如何调试呢?mockjs 可以帮助我们做到这点。

在后端接口开发完成之前,前端可以使用后端已有的接口文档,使用 mockjs 模拟真实接口请求和接收数据,模拟与后端的交互,实现前后端分离开发。这样,我们可以不必等待后端接口与数据开发完成,使用 mockjs 就可以实现前端的完整开发与调试,当后端开发完成后,您只需去掉 mockjs,就可以与真实的接口进行交互。

个人认为 mockjs 有点类似软件测试中的桩 (stub) 模块,前端依赖于后端,后端可以看成是前端的依赖模块,此时后端尚未开发完成,而 mockjs 是模拟后端接口的,所以 mockjs 可以看做是一个桩模块(仅仅是个人想法,如有错误欢迎批评指正)

在本文中,将使用 mockjs 模拟与后端交互,实现 登陆 功能。

安装

本文中的示例是在 Vue2.0 + webpack + vue-cli 上实现的,需要安装以下模块:

# axios
npm install axios --save
# mockjs
npm install mockjs --save-dev
# axios-mock-adapter
npm install axios-mock-adapter --save-dev

代码实例

在项目中 src 文件夹结构 (不完全) 如下,按该结构创建文件夹和代码文件:

  • api
    • api.js
    • index.js
  • mock
    • data
      • user.js
    • index.js
  • main.js

定义 axios 接口

首先我们使用 axois 定义好 api,api/api.js 的内容如下:

import axios from 'axios'
axios.defaults.baseURL = 'http://127.0.0.1:8080'

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

创建后台模拟数据

mock/data/user.js 中,存放一些用户数据,注意在本示例中,使用邮箱 (email) 和密码 (password) 来登录。具体内容如下:

const users = [
  {
    email: 'user1@123.com',
    password: '123456',
    balance: 100,
    birth: '1990-01',
  },
  {
    email: 'user2@123.com',
    password: '123456',
    balance: 200,
    birth: '1991-01',
  },
  {
    email: 'user3@123.com',
    password: '123456',
    balance: 300,
    birth: '1992-01',
  }
]

export { users }

mock/index.js 内容如下:

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

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('/login').reply(config => {
      console.log('mock.onPost')
      // 解析axios传过来的数据
      let { email, password } = JSON.parse(config.data)
      return new Promise((resolve, reject) => {
        // 先创建一个用户为空对象
        let user = null
        setTimeout(() => {
          // 判断模拟的假数据中是否有和传过来的数据匹配的
          let hasUser = users.some(account => {
            // 如果存在这样的数据
            if (account.email === email && account.password === password) {
              user = JSON.parse(JSON.stringify(account))
              // 不把密码发送过去
              user.password = undefined
              return true
            } else {
              // 如果没有这个account
              return false
            }
          })
          // 如果有这个账号
          if (hasUser) {
            resolve([200, {msg: '登录成功', user: user}])
          } else {
            resolve([201, {msg: '账号或密码错误', user: null}])
          }
        }, 1000)
      })
    })
  }
}

在 main.js 中引入 mock

main.js (其他代码已省略) 中引入 mock。

注意:当您需要使用 mock 来模拟与后端交互时,需要加入下面代码;当后端开发完成并且您需要与真实的后端接口进行交互时,只需将下面代码删除即可,并且相应地在 api.js 中修改 axios.defaults.baseURL

import Mock from './mock/index'
Mock.init()

在页面中增加登录方法

比如你的登录页面文件是 Login.vue,为您的登录按钮添加以下方法:

handleLogin () {
  // Element-ui的表单验证
  this.$refs.ruleForm.validate((valid) => {
    if (valid) {
      // 正在登陆,此使登录按钮不可点击
      this.logining = true
      let loginParams = {
        email: this.ruleForm.email,
        password: this.ruleForm.password
      }
      /* 调用axios登录接口 */
      postLogin(loginParams).then(res => {
        console.log(res)
        let { msg, user } = res.data
        if (res.status === 200) {
          // 登录成功,在sessionStorage保存用户信息
          sessionStorage.setItem('user', JSON.stringify(user))
          // 在vuex中存放用户信息
          this.$store.dispatch('setUser', user)
          // 跳转至主页面
          this.$router.push({ path: '/' })
        } else {
          this.$message({
            message: msg,
            type: 'error'
          })
        }
        this.logining = false
      }).catch(err => {
        this.logining = false
        console.log('postLogin catch err:', err)
        this.$message({
          message: err,
          type: 'error'
        })
        return false
      })
    } else {
      console.log('error submit!')
      return false
    }
  })
}

现在 npm run dev 运行项目,输入 email 和 password,点击登录按钮进行登录!