vue项目中使用mock模拟后端数据

前言

使用mock可以让前端不在局限于后端接口,在规定好文档格式后甚至能一次性开发完整个前端接口,大大节省了对接时间,可以说是当前前端必备的技能之一了。最近做新项目,重新搭建了下框架,想着写一篇mock的配置文章,让大家共同进步。


一、npm下载插件

npm install mockjs --save-dev

二、创建mock文件夹

1.在跟目录(src目录同级)下创建mock文件夹

2.mock文件夹下新建index.js文件

import Mock from 'mockjs'
import { param2Obj } from '../src/utils'

import user from './user'

const mocks = [
  ...user
]

// for front mock
// please use it cautiously, it will redefine XMLHttpRequest,
// which will cause many of your third-party libraries to be invalidated(like progress event).
export function mockXHR() {
  // mock patch
  // https://github.com/nuysoft/Mock/issues/300
  Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
  Mock.XHR.prototype.send = function() {
    if (this.custom.xhr) {
      this.custom.xhr.withCredentials = this.withCredentials || false

      if (this.responseType) {
        this.custom.xhr.responseType = this.responseType
      }
    }
    this.proxy_send(...arguments)
  }

  function XHR2ExpressReqWrap(respond) {
    return function(options) {
      let result = null
      if (respond instanceof Function) {
        const { body, type, url } = options
        // https://expressjs.com/en/4x/api.html#req
        result = respond({
          method: type,
          body: JSON.parse(body),
          query: param2Obj(url)
        })
      } else {
        result = respond
      }
      return Mock.mock(result)
    }
  }

  for (const i of mocks) {
    Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
  }
}

// for mock server
const responseFake = (url, type, respond) => {
  return {
    url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
    type: type || 'get',
    response(req, res) {
      console.log('request invoke:' + req.path)
      res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
    }
  }
}

export default mocks.map(route => {
  return responseFake(route.url, route.type, route.response)
})
// '../src/utils'
export function param2Obj(url) {
  const search = url.split('?')[1]
  if (!search) {
    return {}
  }
  return JSON.parse(
    '{"' +
      decodeURIComponent(search)
        .replace(/"/g, '\\"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"')
        .replace(/\+/g, ' ') +
      '"}'
  )
}

 3.mock文件夹下新建mock-server.js文件

const chokidar = require('chokidar')
const bodyParser = require('body-parser')
const chalk = require('chalk')
const path = require('path')

const mockDir = path.join(process.cwd(), 'mock')

function registerRoutes(app) {
  let mockLastIndex
  const { default: mocks } = require('./index.js')
  for (const mock of mocks) {
    app[mock.type](mock.url, mock.response)
    mockLastIndex = app._router.stack.length
  }
  const mockRoutesLength = Object.keys(mocks).length
  return {
    mockRoutesLength: mockRoutesLength,
    mockStartIndex: mockLastIndex - mockRoutesLength
  }
}

function unregisterRoutes() {
  Object.keys(require.cache).forEach(i => {
    if (i.includes(mockDir)) {
      delete require.cache[require.resolve(i)]
    }
  })
}

module.exports = app => {
  // es6 polyfill
  require('@babel/register')

  // parse app.body
  // https://expressjs.com/en/4x/api.html#req.body
  app.use(bodyParser.json())
  app.use(bodyParser.urlencoded({
    extended: true
  }))

  const mockRoutes = registerRoutes(app)
  var mockRoutesLength = mockRoutes.mockRoutesLength
  var mockStartIndex = mockRoutes.mockStartIndex

  // watch files, hot reload mock server
  chokidar.watch(mockDir, {
    ignored: /mock-server/,
    ignoreInitial: true
  }).on('all', (event, path) => {
    if (event === 'change' || event === 'add') {
      try {
        // remove mock routes stack
        app._router.stack.splice(mockStartIndex, mockRoutesLength)

        // clear routes cache
        unregisterRoutes()

        const mockRoutes = registerRoutes(app)
        mockRoutesLength = mockRoutes.mockRoutesLength
        mockStartIndex = mockRoutes.mockStartIndex

        console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed  ${path}`))
      } catch (error) {
        console.log(chalk.redBright(error))
      }
    }
  })
}

4.mock文件夹下新建user.js文件

也就是在index.js中引入的模拟接口文件,这里已登陆接口为例

const tokens = {
  admin: {
    token: 'admin-token'
  },
  editor: {
    token: 'editor-token'
  }
}

export default [
  // user login
  {
    url: '/user/login',
    type: 'post',
    response: config => {
      const { username } = config.body
      const token = tokens[username]

      // mock error
      if (!token) {
        return {
          code: 60204,
          message: 'Account and password are incorrect.'
        }
      }

      return {
        code: 20000,
        data: token
      }
    }
  }
]

5.在main.js中引入

if (process.env.NODE_ENV === 'production') {
  const {
    mockXHR
  } = require('../mock')
  mockXHR()
}

 6.最后一步,也是最容易忘记的一步,在vue.config.js中写入

// webpack-devser@3.X的使用
module.exports = {
    devServer: {
        before: require('./mock/mock-server.js')
    }
}

// webpack-devser@4.X的使用
module.exports = {
    devServer: {
      onBeforeSetupMiddleware: (app, server, compiler) =>{
        require('./mock/mock-server.js')
      }
    }
}


总结

调用接口/user/login就就会执行mock的接口,返回我们写好的数据了。是不是很简单,大家快去试试吧。

mock.js官网:Mock.js

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,对于您的问题,实现带有Mock后端数据的登录系统可以采取以下步骤: 1. 首先,搭建Vue2.0项目,可以使用Vue CLI或手动创建。安装所需要的依赖项。 2. 使用mockjs创建模拟数据(例如用户的信息,登录凭证等)并暴露在项目mock API上。 3. 在Vue定义登录组件,包含用于输入用户名和密码的表单。在提交表单时,使用axios或其他http库发起ajax请求。 4. 创建一个登录API使用axios或其他http库调用mock数据。 5. 如果登录成功,保存登录凭证(可以使用LocalStorage或Cookies)并重定向到指定的页面。否则,显示错误消息。 下面是一个大致的实现方案: 1. 首先安装Vue CLI:npm install -g @vue/cli 2. 创建项目并安装依赖:vue create login-project 3. 安装axios和mockjs:npm install axios mockjs 4. 在/src/mock/下创建一个mock.js文件,包含一些和登录相关的mock数据和API。例如: ```javascript import Mock from 'mockjs' // 模拟用户数据 Mock.mock('/api/user', { 'username|1-5': /[a-z]/, 'password|6-10': /[0-9a-zA-Z]/ }) // 模拟登录API Mock.mock('/api/login', 'post', function (options) { const { username, password } = JSON.parse(options.body) if (username === 'admin' && password === '123456') { return { code: 0, token: 'mock-token' } } else { return { code: -1, message: '用户名或密码错误' } } }) ``` 5. 在main.js引入axios和mockjs并启用mock API: ```javascript import axios from 'axios' import Mock from 'mockjs' axios.defaults.baseURL = 'http://localhost:8080' Mock.setup({ timeout: '100-500' }) // 加载mock模块 require('./mock') ``` 6. 在/src/components/Login.vue创建登录组件: ```html <template> <div> <h2>Login</h2> <form @submit.prevent="login"> <div> <label>Username:</label> <input type="text" v-model="user.username"> </div> <div> <label>Password:</label> <input type="password" v-model="user.password"> </div> <button type="submit">Submit</button> <span>{{ message }}</span> </form> </div> </template> <script> import axios from 'axios' export default { name: 'Login', data () { return { user: { username: '', password: '' }, message: '' } }, methods: { login () { axios.post('/api/login', this.user) .then(response => { if (response.data.code === 0) { localStorage.setItem('token', response.data.token) this.$router.push('/dashboard') } else { this.message = response.data.message } }) .catch(error => { console.error(error) }) } } } </script> ``` 7. 在App.vue定义路由和导航: ```html <template> <div> <router-link to="/">Home</router-link> <router-link to="/login">Login</router-link> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script> ``` 8. 启动开发服务器:npm run serve 现在,您可以通过访问http://localhost:8080/login来在浏览器尝试这个简单的登录系统了。如果您使用的是Vue CLI生成的项目,请注意启动服务时的端口号可能不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值