mock数据

本文详细介绍了如何在前端项目中使用mock数据,包括通过mockServer.js实现对不同HTTP请求的响应模拟,以及在vue.config.js中配置Webpack和DevServer以支持mock数据请求。同时,展示了axios.js中对axios请求库的封装,以及bus.js中事件总线的创建。

前端mock数据

在这里插入图片描述

mockServer.js

module.exports = function (req, res, next) {
    const method = (req.method || 'GET').toLowerCase();
    const url = req.url.split('?')[0];
    if (req.headers['x-requested-with'] === 'XMLHttpRequest') {
        const base = `../src/mock/${method}${url}/index.js`;
        delete require.cache[require.resolve(base)];
        const json = require(base)();
        res.send(json);
    }
    next();
};

vue.config.js

let path = require("path");
function resolve(dir) {
  return path.join(__dirname, dir);
};
let IS_PRODUCTION = process.env.NODE_ENV === 'production';
module.exports = {
    publicPath: '/',
    lintOnSave: false,
    filenameHashing: false,
    pages: {
        index: {
            // page 的入口
            entry: 'src/main.js',
            // 模板来源
            template: 'public/index.html',
            // 在 dist/index.html 的输出
            filename: 'index.html',
            title: '水浦蓝物联网云平台',
            // 在这个页面中包含的块,默认情况下会包含
            // 提取出来的通用 chunk 和 vendor chunk
            chunks: ['chunk-vendors', 'chunk-common', 'index']
        }
    },
    productionSourceMap: !IS_PRODUCTION,
    configureWebpack: (config) => {
      if (IS_PRODUCTION) {
        //为生产环境进行配置 如:去除console.log ,debugger
        config.optimization.minimizer.map((arg) => {
          const option = arg.options.terserOptions.compress;
          option.drop_console = true; // 打开开关
          return arg;
        });
      } else {
        //为开发环境进行配置
      }
    },
    chainWebpack: config => {
      //设置别名  路径优化,但是若要引用static文件夹下文件,则要用一般设置
      config.resolve.alias
        .set("@", resolve("src"))
        .set("@assets", resolve("src/assets"))
        .set("@components", resolve("src/components"))
        .set("@store", resolve("src/store"))
        .set("@pages", resolve("src/pages"))
        .set("@utils", resolve("src/utils"))
    },
    devServer: {
        port: 8080,
        // proxy: {
        //   '/api-admin': {
        //     target: 'http://192.168.3.139:9400', // 代理接口
        //     changeOrigin: true,
        //     pathRewrite:{
        //       '^/api': ''
        //     }
        //     // pathRewrite: {
        //     //     '^/api': '/mock' // 代理的路径
        //     // }
        //   }
        // },
        before: function (app) {
          app.use(require('./server/mockServer'));
        },
        overlay: {
          warning: false,
          error: true
        }
    }
}

axios.js

import axios from 'axios';
import qs from 'qs';
import bus from './bus';

// 默认配置
let instance = axios.create({
  timeout: 30000,
  headers: {
    // 'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Type': 'application/json',
    'x-requested-with': 'XMLHttpRequest'
  }
});

// 定义拦截器
instance.interceptors.request.use(config => {
  const token = window.localStorage.getItem('token');
  if (token) {
    config.headers.common.Authorization = token;
  }

  return config;
}, error => Promise.reject(error));
instance.interceptors.response.use(response => {
  const code = response.data && +response.data.code;
  if (code) {
    if (code === 401) {
      return bus.$emit('goto', '/login');
    }

    if (code === 409) {
      message({
        message: '你的的账号已经在其他地方登陆或退出登录,请重新登录!',
        type: 'warning'
      });
      return bus.$emit('goto', '/login');
    }

    if (code === 403) {
      return message({
        message: '你没有权限',
        type: 'warning'
      });
    }
  }

  return response;
}, error => {
  return Promise.reject(error);
});

// 封装请求对象
let baseUrl = process.env.VUE_APP_URL;
// console.log(baseUrl);
let request = options => new Promise((resolve, reject) => {
  const method = (options.type || 'GET').toLowerCase();
  let config = {
    method: options.type,
    url: baseUrl + options.url
  };
  if (method === 'post' && options.data) {
    config.data = options.data;
  }
  else {
    if (options.data && !options.params) {
      config.params = options.data;
      delete options.data;
    }
  }
  instance(config).then(data => {
    const result = data.data;
    if (+result.code === 200) {
      return resolve(result);
    }

    return reject(result);
  }).catch(error => {
    reject(error);
  });
});

export default {
  install(Vue) {
    Vue.prototype.$axios = request;
  }
};

bus.js

import Vue from 'vue';
export default new Vue();

main.js 引入 axios

### 如何生成 Mock 数据用于测试 Mock 数据的生成可以帮助开发者在前后端分离开发中快速验证前端页面的功能和展示效果,同时也可以用于单元测试、接口测试等场景。以下是一些常用的方法和技术来生成或获取模拟数据。 #### 使用 Mock.js 生成前端测试数据 Mock.js 是一个非常流行的 JavaScript 库,它可以用来拦截 Ajax 请求并返回预设的数据,非常适合前端独立于后端进行开发的情况。通过定义 JSON Schema 或者使用其内置的语法,可以灵活地控制生成的数据类型和格式。 例如,定义一个简单的 Mock 规则如下: ```javascript Mock.mock('/api/users', { 'list|1-10': [{ // 生成1到10条记录 'id|+1': 1, // id自增1 name: '@NAME', // 随机生成姓名 age|20-40: 0 // 年龄范围20至40岁 }] }); ``` 此规则将为 `/api/users` 接口生成包含随机数量用户信息的响应数据 [^1]。 #### 结合 Node.js 和其他框架 除了单独使用 Mock.js 外,还可以将其集成进基于 Node.js 的项目中,与 Express、Koa 等框架结合使用,创建更加复杂的模拟服务。这种方式适用于需要更复杂逻辑处理或者需要持久化存储模拟数据的场景。 #### 自定义模拟数据生成器 对于特定需求,可能还需要编写自定义的数据生成脚本或程序。这可以通过 Python、JavaScript(Node.js)、Java 等多种语言实现。根据具体业务需求设计数据结构,并利用这些语言提供的库函数来生成符合要求的数据。 #### 获取客户端 IP 地址示例 在某些情况下,比如网络应用的安全性考量或是地理位置分析时,可能需要获取客户端的真实 IP 地址。下面是一个 Go 语言中获取客户端 IP 的简单示例: ```go func (c *Context) ClientIP() string { if c.engine.ForwardedByClientIP { clientIP := c.requestHeader("X-Forwarded-For") clientIP = strings.TrimSpace(strings.Split(clientIP, ",")[0]) if clientIP == "" { clientIP = strings.TrimSpace(c.requestHeader("X-Real-Ip")) } if clientIP != "" { return clientIP } } if c.engine.AppEngine { if addr := c.requestHeader("X-Appengine-Remote-Addr"); addr != "" { return addr } } if ip, _, err := net.SplitHostPort(strings.TrimSpace(c.Request.RemoteAddr)); err == nil { return ip } return "" } ``` 这段代码展示了如何从 HTTP 请求头中提取客户端 IP 地址的方法 [^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值