mockjs的增删改查(vue)

参考文章:vue中使用mockjs实现增删改查

安装开发依赖

npm install mockjs -D

安装mockjs在你的开发依赖上,因为你生产环境用的是正式的接口,安装在开发依赖上可以减少你包的大小。

建立mock文件夹

在src目录中,建立一个mock的文件夹。在mock目录下,建一个index.js和一些其他的js文件(下文是user.js)


mock目录.png

)

这是一个带分页的mock数据,可以实现增删改查的功能。

在hospitals.js中

import Mock from 'mockjs'

const data = Mock.mock({
  'items|30': [{
    id: '@id()',
    name: '@ctitle(2,4)医院',
    description: '@cparagraph',
    status: '@boolean',
    created_at: '@datetime'
  }]
})

export default [
  // 获取列表
  {
    url: '/admin/hospitalList',
    type: 'get',
    response: config => {
      const items = data.items
      const { name, currentPage = 1, pageSize = 20 } = config.query
        const mockList = items.filter(user => {
          if (name && user.name.indexOf(name) === -1) return false
          return true
        })
        const pageList = mockList.filter((item, index) => index < pageSize * currentPage && index >= pageSize * (currentPage - 1))

      return {
        code: 20000,
        data: {
          total: mockList.length,
          items: pageList
        }
      }
    }
  },
  // 创建or编辑
  {
    url: '/admin/createHospital',
    type: 'post',
    response: config => {
      let obj  = config.query
      if (obj.id) {
        data.items.some(u => {
          if (u.id === obj.id) {
            u.name = obj.name
            u.description = obj.description
            u.status = obj.status
            return true
          }
        })
        return {
          code: 20000,
          message: '修改成功'
        }
      }else{
        obj.id = Mock.Random.id()
        obj.created_at = Mock.mock('@now')
        data.items.unshift(obj)

        return {
          code: 20000,
          message: '添加成功'
        }
      }

    }
  },
  // 删除
  {
    url: '/admin/delHospital',
    type: 'get',
    response: config => {
      let obj  = config.query
      if (!obj.id) {
        return {
          code: -999,
          message: '参数不正确'
        }
      } else {
        data.items = data.items.filter(u => u.id !== obj.id)
        return {
          code: 20000,
          message: '删除成功'
        }
      }
    }
  },
  // 批量删除
  {
    url: '/admin/batchremove/hospital',
    type: 'post',
    response: config => {
      let str  = config.query.idStr
      let arr = str.split(',')
      data.items = data.items.filter(u => !arr.includes(u.id))
      return {
        code: 20000,
          message: '批量删除成功'
      }
    }
  }

]

在index.js中

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

import user from './user'
import hospitals from './hospitals'

const mocks = [
  ...user,
  ...hospitals
]

// 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)
})

在main.js中

/**
 * If you don't want to use mock-server
 * you want to use MockJs for mock api
 * you can execute: mockXHR()
 *
 * Currently MockJs will be used in the production environment,
 * please remove it before going online ! ! !
 */
if (process.env.NODE_ENV === 'production') {
  const { mockXHR } = require('../mock')
  mockXHR()
}

在组件中按自己平时调用接口使用的习惯即可

遇到的问题

mockjs从数组中随机选择n项组成新数组?

const data = Mock.mock({
  'items|30': [{
    'id|+1': 1,
    account: '@last()',
    nickname: '@cname()',
    role: ['Administrator'],
    permissions: function () {
      let arr = ['All permission','Dashboard','Login','User setting','Auth management'];
      let count = Math.floor(Math.random() * arr.length + 1);
      let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
      while (i-- > min) {
        index = Math.floor((i + 1) * Math.random());
        temp = shuffled[index];
        shuffled[index] = shuffled[i];
        shuffled[i] = temp;
      }
      return shuffled.slice(min);
    },
    created_at: '@datetime',
    updated_at: '@datetime',
  }]
})

生成随机函数的方法:

// 方法一: 打乱数组的顺序,然后slice 切割出来新的数组
function a() {
      let arr = ['All permission','Dashboard','Login','User setting','Auth management'];
      let count = Math.floor(Math.random() * arr.length + 1);
      let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
      while (i-- > min) {
        index = Math.floor((i + 1) * Math.random());
        temp = shuffled[index];
        shuffled[index] = shuffled[i];
        shuffled[i] = temp;
      }
      return shuffled.slice(min);
    }
// 方法二:
function a() {
      let arr = ['All permission','Dashboard','Login','User setting','Auth management'];
      let count = Math.floor(Math.random() * arr.length + 1);
      var  i = arr.length, min = i - count ;
    arr.sort((a,b)=>{
        return Math.random() > 0.5 ? a-b : b-a
    })
    return arr.slice(min);
    }
// 方法三:
function a() {
      let arr = ['All permission','Dashboard','Login','User setting','Auth management'];
      let count = Math.floor(Math.random() * arr.length + 1);
      let newArr = [];
      var pick = function () {
           var index = Math.ceil((arr.length * Math.random())) - 1;
           return arr.splice(index, 1);
       }
       for (var i = 0; i < count ; i++) {
           newArr.push(pick()[0]);
      }
      return newArr;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352