前端仿真实现之Mock
来源:互联网 发布:数控转塔冲床编程招聘 编辑:程序博客网 时间:2024/04/30 16:34
项目地址
前端demo
前言
我们大前端怎么能够被后端掣肘?不可能。有了数据仿真,我们再也不用等待后端实现了,可以自己开心的测试。这里我推荐下Mock.js
正文
可能有小伙伴问,官网这么清楚,你还写篇博客,凑数么。
这里提供几个我写项目遇到的问题。
Array有缺陷
好吧。这个缺陷就是只有从属性值 array 中随机选取 1 个元素,作为最终值(’name|1’: array)。你想取俩个,那就是重复两次。心好累有没有。
我不是很确定是不是我没发现。反正我是不知道。知道的小伙伴请告知。
/** * 获取随机数 * * @export * @param {any} min * @param {any} max * @returns */export function getRandomNumber(min, max) { return parseInt(Math.random() * (max - min + 1) + min, 10);}/** * 根据给定数组生成随机数组(打乱排序取值) * * @export * @param {any} arr * @param {any} count * @returns */export function getRandomArray(arr, count) { const shuffled = arr.slice(0); let i = arr.length; count = count || getRandomNumber(1, i); const min = i - count; let 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);}
通过以上方法就可以机智的根据给定数组生成随机数组。原理简单:打乱排序取值。一看便知。
怎么仿真
我还能怎么仿真?用手啊啊。。。。
好吧,言归正传。一般而言都是这样子化模块
每个模块写自己的模块内的数据,然后暴露方法(相当于后端服务层方法)
//login.jsimport { param2Obj } from 'utils';const userMap = { pzpzpz: { role: ['admin'], token: 'pz', avatar: 'http://www.nymlc.com/assets/pz.jpg', name: 'pz' }, ln: { role: ['guest'], token: 'ln', avatar: 'http://www.nymlc.com/assets/lc.jpg', name: 'ln' }};export default { loginByUsername(data) { const { username } = JSON.parse(data.body); let res = {}; for (const key in userMap) { if (username.indexOf(key) !== -1) { res = userMap[key]; } } return res; }, getUserInfo: config => { const { token } = param2Obj(config.url); if (userMap[token]) { return userMap[token]; } else { return userMap.pzpzpz; } }};
不过这样子就有个问题,数据都是分散的。以我博客为例,我想做个按标签过滤文章。这时候发现文章数据里的本该存储标签外键和标签里的id对不上。很明显啊。
所以呢咱们可以这样子。想象下后端开发流程。后端呢每次会写一堆的SQL语句(都是insert)来造假数据。好吧,也是仿真啦。我们也这样子做。
要知道,后端数据都来源于数据库(这里假定只有一个),那我们也新建一个database.js来生成我们项目需要的所有数据。生成顺序当然是先生成外键表咯。数据格式使用json。
// database.jsimport { getRandomArray } from 'utils';import Mock from 'mockjs';const coverMap = ['https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507457009232&di=6902e746b953a6ab67d8ea49c9915694&imgtype=0&src=http%3A%2F%2Fimg2.niutuku.com%2Fdesk%2F1212%2F2239%2F2239-ntk36472.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507457009229&di=4fa2d5a9262925d99ea61c6edc010f57&imgtype=0&src=http%3A%2F%2Ff3.topit.me%2F3%2F9c%2Fbc%2F1133861393232bc9c3o.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1508521724&di=f1f67331fb10b9f58671b6a6056c6a43&imgtype=jpg&er=1&src=http%3A%2F%2Fres.silver.org.cn%2FUploads%2FPicture%2F2017-07-04%2F595bb8ba38d6b.jpeg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507927008370&di=05e28eaaee801bcbb43f1212f636020c&imgtype=0&src=http%3A%2F%2Fwww.3dmgame.com%2Fuploads%2Fallimg%2F140110%2F153_140110160156_4.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507927008369&di=07d42b82018c597c92f20a32f54ffd66&imgtype=0&src=http%3A%2F%2Fimg2.niutuku.com%2Fdesk%2F1208%2F2033%2Fntk-2033-4469.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507927008358&di=af02ad5053f0c3bdff832d2f0d78f7a0&imgtype=0&src=http%3A%2F%2Fimg2.niutuku.com%2Fdesk%2F1212%2F2214%2F2214-ntk36035.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507927008356&di=838d3fab00002e89f731947f4bde01d7&imgtype=0&src=http%3A%2F%2Fimg2.niutuku.com%2Fdesk%2F1207%2F1015%2Fntk123675.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507927008356&di=e009e6ee4acb68c79d6e5ab28f40e2ba&imgtype=0&src=http%3A%2F%2Fimg2.niutuku.com%2Fdesk%2F1208%2F1910%2Fntk-1910-28555.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507927008353&di=48ae779513b739164b4cd8b3797ba51c&imgtype=0&src=http%3A%2F%2Fimg2.niutuku.com%2Fdesk%2F1208%2F1459%2Fntk-1459-4782.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507457009222&di=55fbd0af6bf7735d378d5c6fe74456a1&imgtype=0&src=http%3A%2F%2Fimg2.niutuku.com%2Fdesk%2F130126%2F52%2F52-niutuku.com-1499.jpg'];const articles = [];const categorys = [];const tags = [];for (let i = 0; i < 10; i++) { categorys.push(Mock.mock({ _id: '@increment', name: '@name' }));}for (let i = 0; i < 10; i++) { tags.push(Mock.mock({ _id: '@increment', name: '@name' }));}for (let i = 0; i < 10; i++) { articles.push(Mock.mock({ _id: '@increment', title: '@ctitle', title_color: '@color', author: '@cname', created_at: '@date("yyyy/MM/dd")', updated_at: '@date("yyyy/MM/dd")', 'views|30-80': 40, 'praises|30-40': 36, 'comments|3-18': 6, 'cover|1': coverMap, content: '@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph@cparagraph', categorys: getRandomArray(categorys), tags: getRandomArray(tags) }));}export { articles, categorys, tags};
具体模块逻辑就可以随自己业务逻辑自由发挥。eg:article.js
import { articles } from './database';// 根据标签获取文章const getArticlesByTags = tags => { const res = new Set(); articles.forEach(article => { let i = 0; tags.forEach(tag => { if (article.tags.some(e => e._id === +tag)) { i++; } }); if (i === tags.length) { res.add(article); } }); return Array.from(res).sort((a, b) => a.updated_at > b.updated_at ? -1 : 1);};
后记
发现我写文章后记没有一次是正经过。
阅读全文
0 0
- 前端仿真实现之Mock
- 前端mock数据
- Mock,前端mock数据的神器
- SkyEye硬件仿真实现之四 网络芯片仿真 [嵌入式]
- Swagger+NodeJS Mock前端数据
- 从小白的角度来看:利用mitmproxy自动监控/修改前端请求,实现简单mock
- 【Mock】之基础介绍
- 单元测试之模拟Mock
- 单元测试之Mock
- python之mock
- 单元测试之Mock
- charles之断点mock
- 【前端开发】 5分钟创建 Mock Server
- 使用RAP搭建前端Mock Server
- 【Mock.js】前端模拟JSON数据
- 使用阿里RAP搭建前端Mock Server
- 使用Mock.js生成前端测试数据
- 使用RAP搭建前端Mock Server
- 链表练习:多项式的加法和乘法
- java的自我总结
- hadoop编程(5)-MapReduce案例:通过MinimalMapReduce进一步了解MR的机制
- 队列
- java虚拟机详解
- 前端仿真实现之Mock
- 流式大数据处理的三种框架:Storm,Spark和Samza
- JavaScript中简单的Math相关方法
- 三子棋
- 第七周-项目3
- 随机生成图,dijkstra算法求最短路径,深度、广度优先历遍【待更新其他算法】
- 基于koa2、vue2、mongodb的个人网站(前端序篇)
- 大数据学习22:Apache-Hadoop 2.8.1 集群部署
- <10/22>集训周记