1. 安装

  1. yarn add mockjs -D
  2. yarn add axios

2. 编写mock入口/注册文件

image.png

  1. // /mock/index.js
  2. // 引入Mock
  3. import Mock from 'mockjs'
  4. // 为了解决与后台接口共存时,丢失cookies的问题
  5. Mock.XHR.prototype.withCredentials = true
  6. // 设置拦截ajax请求的相应时间
  7. Mock.setup({ timeout: '200-600' })
  8. const configArray = []
  9. const registerMock = ({
  10. url,
  11. method = 'get',
  12. template
  13. }) => {
  14. Mock.mock(new RegExp('^' + url), method, template)
  15. }
  16. // 遍历当前目录的mock文件
  17. const files = require.context('./', true, /\.js$/)
  18. files.keys().forEach(key => {
  19. if (key === './index.js') return
  20. files(key).default.forEach(item => {
  21. configArray.push(item)
  22. })
  23. })
  24. // 注册所有的mock服务
  25. configArray.forEach(mockItem => {
  26. registerMock(mockItem)
  27. })

3. 编写模拟接口文件

  1. // /mock/login.js
  2. const login = {
  3. url: '/mock/user/info',
  4. template: {
  5. status: 200,
  6. message: 'success',
  7. data: {
  8. total: 100,
  9. 'result|3': [
  10. {
  11. id: '@guid',
  12. name: '@cname', // 中文名
  13. aliasName: '@first()', // 随机英文名
  14. 'age|20-30': 23,
  15. 'job|1': ['前端工程师', '后端工程师', 'UI工程师', '需求工程师'],
  16. birthday: '@datetime', // 随机时间
  17. mobile: '@mobile', //
  18. email: '@email', // 随机email
  19. address: '@county(true)', // 随机地址
  20. domicile: '@city(true)', // 随机城市
  21. 'list|5': [
  22. {
  23. id: '@guid',
  24. 'job|1': ['前端工程师', '后端工程师', 'UI工程师', '需求工程师'],
  25. obj: {
  26. name: '@cname',
  27. email: '@email'
  28. }
  29. }
  30. ]
  31. }
  32. ]
  33. }
  34. }
  35. }
  36. // 前面index定义导出数组, 需要遵循index文件的规范
  37. export default [
  38. login
  39. ]

4. axios 封装

image.png

  1. // /api/http.js
  2. import Axios, { CancelToken } from 'axios'
  3. /**
  4. * 默认axios,配置
  5. * @type {[type]}
  6. */
  7. const http = Axios.create({
  8. timeout: 1000 * 30
  9. })
  10. const cancelTokenMap = {}
  11. const openMock = true
  12. //
  13. if (process.env.NODE_ENV === 'development' && openMock) {
  14. http.defaults.baseURL = '/mock'
  15. }
  16. http.interceptors.request.use(config => {
  17. config.headers.common['Content-Type'] = 'application/json;charset=UTF-8'
  18. // cancelToken
  19. if (config.cancelToken) {
  20. config.cancelToken = new CancelToken(c => {
  21. if (cancelTokenMap[config.cancelToken]) {
  22. cancelTokenMap[config.cancelToken].push(c)
  23. } else {
  24. cancelTokenMap[config.cancelToken] = [c]
  25. }
  26. })
  27. }
  28. return config
  29. })
  30. /**
  31. * 响应拦截器
  32. * @param {[type]} (res) [description]
  33. * @return {[type]} [description]
  34. */
  35. http.interceptors.response.use(
  36. res => {
  37. const { data: { status }, config } = res
  38. if (openMock) {
  39. const mockUrl = config.baseURL + config.url
  40. console.clear()
  41. console.log(`%c Mock: ${mockUrl}`, 'font-size: 18px; color: blue')
  42. console.log('data :', JSON.parse(JSON.stringify(res.data.data.result)))
  43. }
  44. if (~~status === 200) {
  45. return Promise.resolve(res.data)
  46. } else {
  47. messageHandler(res, config.messageFlag)
  48. return Promise.reject(res.data)
  49. }
  50. },
  51. err => {
  52. // 错误
  53. return Promise.reject(err)
  54. }
  55. )
  56. /**
  57. * 中断请求
  58. * @param id
  59. */
  60. http.abort = id => {
  61. if (cancelTokenMap[id]) {
  62. cancelTokenMap[id].forEach(c => c())
  63. delete cancelTokenMap[id]
  64. }
  65. }
  66. const messageHandler = ({ msg }, messageFlag = true) => {
  67. if (messageFlag) {
  68. this.alert({ type: 'error', message: msg || '网络错误' })
  69. }
  70. }
  71. export default http

5. 统一导出api

  1. // /api/index.js
  2. export * from './login'
  3. // /api/login.js
  4. export const apiGetUserInfo = () => {
  5. return http.get('/user/info')
  6. }

6. 使用

  1. // main.js
  2. import '@/mock'
  3. // xxx.vue
  4. import { apiGetUserInfo } from '@/api'
  5. export default {
  6. created() {
  7. this.getMock()
  8. },
  9. methods: {
  10. async getMock() {
  11. const { data: { result } } = await apiGetUserInfo()
  12. console.log(result)
  13. }
  14. }
  15. }

image.png

常用的Mock-template随机函数

  1. const commonUse = {
  2. // 返回一个随机的布尔值。
  3. boolean: '@boolean',
  4. // 返回一个随机的自然数(大于等于 0 的整数)。
  5. natural: '@natural(10, 1000)',
  6. // 返回一个随机的整数。
  7. integer: '@integer(10, 1000)',
  8. // 返回一个随机的浮点数。
  9. float: '@float(10, 1000, 0, 2)',
  10. // 返回一个整型数组。
  11. range: '@range(10)',
  12. // 返回一个随机的日期字符串
  13. date: '@date',
  14. // 返回一个随机的日期和时间字符串。
  15. datetime: '@datetime',
  16. // 返回当前的日期和时间字符串。
  17. now: '@now',
  18. // 生成一个随机的图片地址。
  19. image: '@image',
  20. // 随机生成一个有吸引力的颜色,格式为 '#RRGGBB'。
  21. color: '@color',
  22. // 随机生成一段文本。
  23. paragraph: '@cparagraph',
  24. // 随机生成一句中文标题。
  25. ctitle: '@ctitle(3, 6)',
  26. // 随机生成一个常见的中文姓名
  27. cname: '@cname',
  28. // 随机生成一个邮件地址。
  29. email: '@email',
  30. // 随机生成一个省市区。
  31. county: '@county',
  32. // 随机生成一个 GUID。
  33. guid: '@guid'
  34. }