前端先行模拟接口(mock+expres+json)

news2024/11/16 12:33:58

目录

mock模拟数据:data/static.js

路由:index.js

服务器:server.js

yarn /node 启动服务器:yarn start

客户端:修改代理路径(修改设置后都要重启才生效)

示例

后端框架express构建服务器

前端发起请求

静态数据:res.status === 304

3xx状态码:重定向+缓存

301 Moved Permanently:永久重定向,搜索引擎会更新

302 Found:临时重定向,搜索引擎通常不会更新索引

304 Not Modified:资源未修改,可以使用本地缓存

JSON解析和生成

JSON生成JSON.stringify(value,replacer?,space?)​​​​​​​


Image · nuysoft/Mock Wiki · GitHub

适用于前端先行,api中有设置mock 

mock模拟数据:data/static.js

// 导入 Mock 模块
import Mock from 'mockjs'

// 获取 Random 对象
const Random = Mock.Random

// 生成随机 ID、邮箱、IP、城市、日期时间等数据
//Random.id() 再@id  等价于 直接使用  Random.id(),推荐用@id,简洁
Random.id()
Random.email()
Random.ip()
Random.city()
Random.datetime()
Random.now()
Random.cname()

// 手机号前缀列表
const phonePrefix = ['132', '135', '189']
//Math.random() 函数返回一个 0 到 1 之间的随机小数
//index索引值将被用来选择一个前缀。
const index = Math.floor(Math.random() * phonePrefix.length)
//随机的8位数字串
const phone = phonePrefix[index] + Mock.mock(/\d{8}/)

// 静态数据对象
const static_data = {
  // 登出模拟数据
  logout: {
    // 从[0, 200]中随机选择一个元素作为模拟数据
    "code|1": [0, 200],
    "data": null,
    "message|1": ["执行成功"]
  },
  // 登录模拟数据
  login: {
    "code": 1,
    "data": {
        "datas": [{
            "user": {
                "status": 1,
                "userid": "@id",
                "userName": Random.string('lower', 5),  // 随机小写字母用户名
                "createTime": "@datetime",  // 随机日期时间
                "modifyTime": "@now",  // 当前时间
                "leader|1": [true, false]  // 随机领导状态
            },
            "resources": null
        }]
    },
    "message": "执行成功"
  },
  // 用户信息模拟数据
  info: {
    "code": 1,
    "data": {
        "datas": [{
            "userid": "@id",
            "userName": Random.string('lower', 5),  // 随机小写字母用户名
            "realName": "@cname",  // 随机中文姓名
            "createTime": "@datetime",  // 随机日期时间
            "modifyTime": "@now",  // 当前时间
            // @id() 是 Mock.js 提供的一个占位符,用于生成一个随机的唯一标识符。与之前的 @id 不同,这里使用了括号,这表示它会生成一个新的唯一标识符,而不是使用同一个。
            "orgId": "@id()",  // 随机组织 ID
            "email": "@email",  // 随机邮箱
            "phone": phone,  // 随机手机号
            // true,生成的城市名会带有省份,例如:"广东省深圳市"
            "city": "@city(true)",  // 随机城市名
            "ip": "@ip",  // 随机 IP 地址
            "leader|1": [true, false]  // 随机领导状态
        }]
    },
    "message": "执行成功"
  }
}

// 生成模拟数据并导出
let loginMock = Mock.mock(static_data.login),
    logoutMock = Mock.mock(static_data.logout),
    infoMock = Mock.mock(static_data.info)

export {
  loginMock,
  logoutMock,
  infoMock
}

// 使用Mock.mock来生成模拟数据
const data = Mock.mock({
  code: 1,
  data: {
      pid: '@id',           // 生成随机的ID
      date: Random.now(),   // 生成当前时间
      'list|1-10': [{       // 生成1到10个对象的数组
          'id|+1': 1,        // 从1开始,递增生成id
          'valiue|+1': Random.increment()  // 使用Random.increment()生成递增的值
      }]
  },
  message: 'succ'         // 设置消息
})

const getItem = JSON.stringify(data, null, 4)

路由:index.js

import { loginMock, logoutMock, infoMock } from './data/static.js'
// 定义 user 函数,用于处理路由和请求
const user = function (app) {
    // 登录
    app.get('/api/user/login', (req, res) => {
        res.send(loginMock);
    });

    // 用户信息
    app.get('/api/user/info', (req, res) => {
        res.send(infoMock);
    });

    // 退出
    app.get('/api/user/logout', (req, res) => {
        res.send(logoutMock);
    });
};

export default user

服务器:server.js

node/express都可实现,express代码量更少

import express from 'express'
import bodyParser from 'body-parser'
// chalk加颜色的
import chalk from 'chalk'

// 创建一个Express应用程序实例
let app = express();
// 使用body-parser中间件解析urlencoded和json请求体
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// 用户权限
import user from './user/index.js';
user(app);

// 首页
import home from './home/index.js';
home(app);

// 上传
import upload from './upload/index.js';
upload(app);


// 监听端口以便接受HTTP请求
// 启动监听
app.listen(5899, () => {
    console.log(chalk.blue('Express mock server listening on port 5899'));
});

yarn /node 启动服务器:yarn start

客户端:修改代理路径(修改设置后都要重启才生效)

​​​​​​​

const configStatic = {
  title: '后台',  // 网站的标题
  icon: '//c/favicon.ico',  // 网站的图标路径
  publicPath: {
    development: '/',  // 开发环境的公共路径
    online: '//ment/',  // 在线环境的公共路径
    uat: '//jment/uat',  // UAT环境的公共路径(User Acceptance Testing”(用户验收测试))
    test: '//ent/test'  // 测试环境的公共路径
  },
  proxy: {
    '/api': {  // 代理规则,将以 /api 开头的请求转发到指定的目标地址
      target: 'http://localhost:5899',  // 代理的目标地址
      changeOrigin: true,  // 设置请求头中的 Origin 字段为目标地址,用于处理跨域
      //pathRewrite: {
      // '^/api': '/'  // 修改请求路径,将 /api 替换为空字符串
      //}
    }
  }
}

module.exports = configStatic

示例

后端框架express构建服务器

// 引入所需的模块和数据
import express from 'express';
import { applyConfMock } from './data/static.js';

const app = express();
const port = 3000; // Replace with your desired port number

// 处理 POST 请求
app.use(express.json());

app.post('/api/upload/applyconf', (req, res) => {
  const id = req.body.id; // Get the id from the request body
  const result = applyConfMock[id]; // Use the id to get the corresponding data
  res.send(result);
});

// 启动服务器
app.listen(port, () => {
  console.log(`Server is listening at http://localhost:${port}`);
});

前端发起请求

const id = 123; // Replace with the actual id value
const data = { id: id }; // Create an object with the id property

fetch('/api/upload/applyconf', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => {
  // Handle the response result
})
.catch(error => {
  // Handle errors
});

静态数据:res.status === 304

axios默认会处理304响应,不会返回304状态码的内容,而是直接使用之前的缓存数据。

3xx状态码:重定向+缓存

301 Moved Permanently:永久重定向,搜索引擎会更新

302 Found:临时重定向,搜索引擎通常不会更新索引

304 Not Modified:资源未修改,可以使用本地缓存

JSON解析和生成

var str = '{"name": "参宿","id":7}';      //'JSON字符串'
var obj = JSON.parse(str);                //JSON.parse(str)
console.log(obj);                       //JSON的解析(JSON字符串转换为JS对象)

//Object { name: "参宿", id: 7 }
var jsonstr = JSON.stringify(obj);        //JSON.stringify(obj)
console.log(jsonstr);                     //JSON的生成(JS对象转换为JSON字符串)

JSON.parse(text[, reviver])//reviver函数参数,修改解析生成的原始值,调用时机在 parse 函数返回之前。
//k:key,v:value
JSON.parse('{"p": 5}', function (k, v) {
    if(k === '') return v;     // 如果到了最顶层,则直接返回属性值,
    return v * 2;              // 否则将属性值变为原来的 2 倍。
});                            // { p: 10 }

//从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身
JSON.parse('{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}', function (k, v) {
    console.log(k); // 输出当前的属性名,从而得知遍历顺序是从内向外的,
                    // 最后一个属性名会是个空字符串。
    return v;       // 返回原始属性值,相当于没有传递 reviver 参数。
});

// 1
// 2
// 4
// 6
// 5
// 3
// ""

JSON生成JSON.stringify(value,replacer?,space?)

  1. value: 要转换的 JavaScript 对象、数组、字符串、数字、布尔值或 null
  2. replacer (可选): 一个函数或数组,用于控制转换过程中的属性过滤和转换操作。
  3. space (可选): 用于控制输出字符串的格式化,可以是一个字符串或数字。

如果是一个数字,表示缩进的空格数;

如果是一个字符串,表示使用该字符串作为缩进。

const data = {
    name: "Alice",
    age: 25,
    address: "123 Main St",
    secretInfo: "This is a secret"
};

// 使用 replacer 函数来过滤掉 secretInfo 属性
const jsonStringWithReplacer = JSON.stringify(data, (key, value) => {
    if (key === "secretInfo") {
        return undefined; // 过滤掉 secretInfo 属性
    }
    return value;
}, 2);

console.log(jsonStringWithReplacer);

const data = {
    name: "Bob",
    age: 28,
    hobbies: ["coding", "gaming"],
    address: "456 Elm St"
};

// 使用 replacer 数组来只保留 name 和 hobbies 属性
const jsonStringWithArrayReplacer = JSON.stringify(data, ["name", "hobbies"], 2);

console.log(jsonStringWithArrayReplacer);
import Mock from 'mockjs'

// 定义模板
const template = {
    'list|1-10': [{}]
}

// 生成模拟数据,转换为 JSON Schema 格式的数据
// JSON Schema 来验证它是否符合预期的数据结构
const data = Mock.toJSONSchema(template)

// 测试日志
console.log(JSON.stringify(data, null, 4))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Power BI中实现购物篮分析详解

一、购物篮分析简介 相信,很多人都听过沃尔玛购物篮分析的故事---“啤酒和尿布湿“,即分析购买尿布湿的顾客最喜欢购买的商品是什么?(啤酒)。在零售终端经营中,通过购物篮分析,分析不同商品之间…

Leetcode-每日一题【剑指 Offer 16. 数值的整数次方】

题目 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入:x 2.00000, n 10输出:1024.00000 示例 2: 输入&#…

数据挖掘全流程解析

数据挖掘全流程解析 数据指标选择 在这一阶段,使用直方图和柱状图的方式对数据进行分析,观察什么数据属性对于因变量会产生更加明显的结果。 如何绘制直方图和条形统计图 数据清洗 观察数据是否存在数据缺失或者离群点的情况。 数据异常的两种情况…

每日后端面试5题 第三天

1. 线程有哪几种状态以及各种状态之间的转换?(必会) 看图: 图片来自 线程状态转换图及其5种状态切换_小曹的blog的博客-CSDN博客 图片来自 总算把线程六种状态的转换说清楚了! - 知乎 线程一共有4种状态,分别是: 1.…

js手写贪吃蛇游戏

前端手写贪吃蛇游戏 贪吃蛇游戏 场景 使用了js 和 html /css 就可以完成 一个贪吃蛇小游戏 技术分析 主要用到的几个技术点: clientWidth :元素的宽度,包含内边距clientHeight :元素的高度,包含内边距setInterval&am…

【论文笔记】Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

原文链接:https://arxiv.org/abs/2301.01283 1. 引言 受到DETR启发,本文提出鲁棒的端到端多模态3D目标检测方法CMT(跨模态Transformer)。首先使用坐标编码模块(CEM),通过将3D点集隐式地编码为多…

面试笔记:Android 架构岗,一次4小时4面的体验

作者:橘子树 此次面试一共4面4小时,中间只有几分钟间隔。对持续的面试状态考验还是蛮大的。 关于面试的心态,保持悲观的乐观主义心态比较好。面前做面试准备时保持悲观,尽可能的做足准备。面后积极做复盘,乐观的接受最…

[分享]STM32G070 串口 乱码 解决方法

硬件 NUCLEO-G070RB 工具 cubemx 解决方法 7bit 改为 8bit printf 配置方法 添加头文件 #include <stdio.h> 添加重定向代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endi…

安装程序报错问题解决 -2147287037 <<30005>> 2203

本文如下报错适用&#xff1a; 一、The installer has encountered an unexpected error installing this package. Thismay indicate a problem with this package. The error code is 2203 二、错误 2203.数据库&#xff1a; C:\WINDOWS\Installer\inprogressinstallinfo.i…

别找了,这7个AI绘画图软件够你用了!

AI 绘图工具最妙的是也让人人都能成为朋友圈里的“画家”&#xff0c;如果你也想要拥有一个趁手的 AI 绘画工具&#xff0c;那么就跟随本文一起来看看吧&#xff01;本文精选了7全球顶尖的AI绘图工具给大家&#xff0c;包括&#xff1a;即时灵感、Jasper Art、Images.ai、Night…

休闲卤味强势崛起:卤味零食成为新一代热门美食

随着人们生活水平的提高和消费观念的转变&#xff0c;休闲卤味逐渐成为了人们日常生活中的热门美食。据最新数据显示&#xff0c;2022年&#xff0c;我国卤味市场销售额达到了约2000亿元&#xff0c;预计到2025年将突破3000亿元大关。其中&#xff0c;休闲卤味以每年10%的速度持…

趋势洞察:中国企业高质量出海白皮书!

目前&#xff0c;我国仍处于战略发展机遇期的大背景&#xff0c; 面对全球经济放缓、不确定性增强的常态&#xff0c;国内高端市场的竞争也日趋激烈&#xff0c;对于寻求高质量发展的中国企业&#xff0c; 出海将成为重要的增长点。 今天运营坛为大家整理了一份《中国企业高质量…

弹簧阻尼系统前馈PID位置控制(PLC完整闭环仿真SCL+ST代码)

弹簧阻尼系统的前馈PID控制请参看下面文章链接: 前馈控制之如何计算前馈量(质量弹簧阻尼系统)_前馈控制量_RXXW_Dor的博客-CSDN博客带前馈控制的博途PID程序请参看下面的文章链接:首先我们看下什么是弹簧阻尼系统。1、质量弹簧阻尼模型。_前馈控制量https://rxxw-control.bl…

使用Spring五大注解来更加简单的存储Bean对象

在使用Spring框架的时候我们如果使用这种方式来存储bean对象的话未免有点太麻烦了 <bean id"xxx" class"xxx"> </bean> 为了简化存储Bean对象的操作&#xff0c;我们可以使用五大类注解来进行存储Bean对象 我们首先要在配置文件配置扫描路径…

IoTDB在springboot2中的(二) 查询

上一章我们处理的基本的构建接入&#xff0c;以及插入的处理&#xff0c;那么接下来我们进行查询的操作处理。 我们继续在IoTDBSessionConfig工具类中加入查询的方法处理 /*** description: 根据SQL查询最新一条数据* author:zgy* param sql sql查询语句&#xff0c;count查询…

JVM 类加载和垃圾回收

JVM 1. 类加载1.1 类加载过程1.2 双亲委派模型 2. 垃圾回收机制2.1 死亡对象的判断算法2.2 垃圾回收算法 1. 类加载 1.1 类加载过程 对应一个类来说, 它的生命周期是这样的: 其中前 5 步是固定的顺序并且也是类加载的过程&#xff0c;其中中间的 3 步我们都属于连接&#xf…

【Java-16】动态代理的使用方法及原理实现

代理模式&#xff1a;静态代理 目标 了解静态代理模式实现 路径 静态代理概述静态代理案例 静态代理概述 静态代理&#xff1a; 是由程序员创建或工具生成代理类的源码&#xff0c;再编译成为字节码 &#xff08;字节码文件在没有运行java之前就存在了&#xff09; 在编译…

Linux——常用命令(2)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 前期回顾 【新星计划Linux】——常用命令&#xff08;1&#xff09; 目录 一.其它常用命…

vue或uniapp使用pdf.js预览

一、先下载稳定版的pdf.js&#xff0c;可以去官网下载 官网下载地址 或 pdf.js包下载(已配置好&#xff0c;无需修改) 二、下载好的pdf.js文件放在public下静态文件里&#xff0c; uniapp是放在 static下静态文件里 三、使用方式 1. vue项目 注意路径 :src"static/pd…

在矩池云使用ChatGLM-6B ChatGLM2-6B

ChatGLM-6B 和 ChatGLM2-6B都是基于 General Language Model (GLM) 架构的对话语言模型&#xff0c;是清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同发布的语言模型。模型有 62 亿参数&#xff0c;一经发布便受到了开源社区的欢迎&#xff0c;在中文语义理解和对话生成上有…