前端mock了所有……
目录
一、背景描述
二、开发流程
1.引入Mock
2.创建文件
3.需求描述
4.Mock实现
三、总结
一、背景描述
前提:
事情是这样的,老板想要我们写一个demo拿去路演/拉项目,有一些数据,希望前端接一下,写几个表格,画几个图,然后leader们又有其他考量,决定把数据处理完(处理成一群JSON数据)给前端,前端自己写一些查询,分页,绘图,因为数据量不算太大,一个JSON也就最多5MB,所以客户端处理完全OK,于是就这样,前端写所有的一切开始了。
哦,故事的开始是,我使用的是RuoYi的模板,感谢!很规范,让我少了很多繁琐的工作。
二、开发流程
第一步,关于RouYi:若依管理系统
文档:介绍 | RuoYi
第二步,关于Mock:Mock.js
1.引入Mock
因为前端处理所有,所以不是--save dev
npm install mockjs -g
src\main.js
import './mock'; // 执行 mock.js 中的副作用
import Mock from 'mockjs'; // 导入 Mock 对象,我们在main中不使用这个,暂时引入来打印数据,等下就删掉console.log(Mock);
试试打印Mock,如果出现这些,代表引入正常了:
2.创建文件
创建如下的结构——data是存放我的一些mock数据,modules是不同模块的mock处理。
src\mock\index.js
import './modules/user' // 引入登录用户模块的 mock
export default {}
src\mock\modules\user.js
import Mock from 'mockjs'// 模拟用户登录数据
Mock.mock('/login', 'post', (options) => {const { username, password } = JSON.parse(options.body)// 检查用户名和密码if (username === 'admin' && password === '123456') {return {code: 200,msg: '登录成功',token: '111111' // 模拟一个 token}} else {return {code: 500,msg: '用户不存在/密码错误'}}
})// 模拟路由数据
Mock.mock('/getRouters', 'get', {code: 200,msg: '操作成功',data: [{name: 'Project',path: '/project',hidden: false,redirect: 'noRedirect',component: 'Layout',alwaysShow: false,meta: {title: '项目管理',icon: 'form',noCache: false,link: null},children: [//...]},]
})// 模拟获取用户信息接口
Mock.mock('/api/user/info', 'get', {code: 200,message: '获取成功',data: {name: 'admin',roles: ['admin'],avatar: 'https://example.com/avatar.png'}
})// 模拟用户列表接口
Mock.mock('/api/users', 'get', {code: 200,message: '获取成功',data: Mock.mock({'users|10': [{id: '@id',name: '@cname',age: '@integer(20, 50)',gender: '@pick(["male", "female"])',email: '@email'}]})
})Mock.mock('/logout', 'post', {code: 200,message: '退出登录成功'
})export default Mock
上述的操作都是在基于rouyi的Demo定义的返回值,上面写了一些简单的用户登录和获取路由信息的mock,也就相当于平时跟后端接接口的一些过程,只是这部分前端来写了,比较难的是下面部分,前端处理列表数据,并且进行查询等等处理。
3.需求描述
我需要展示一个项目列表,那么项目列表支持,分页和查询功能。
除此之外,我还需要点击列表的某一行,能显示这一个项目里的角色列表,并且也支持分页查询。
首先,我需要的参数和接口如下:
src\api\project.js
import request from '@/utils/request'// 查询项目列表
export function listProject(query) {return request({url: '/project/list',method: 'get',params: query})
}// 查询项目内的角色列表
export function listData(query) {return request({url: '/project/role/data/list',method: 'get',params: query})
}//query就是下面的queryParams,字段可以根据需求增减
const data = reactive({form: {},queryParams: {pageNum: 1,pageSize: 10,projectId: undefined,projectStage: undefined,firstStartDate: undefined,endDate: undefined},rules: {projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],}
})
4.Mock实现
官网上有一个简单的例子:
Mock.mock(/\.json/, function(options) {
return options
})
我这里的数据结构如下:
src\mock\data\projects.json
[{"id": 1,"projectId": "projectAA","projectName": "测试项目名称","totalCases": 174,"firstStartDate": "2022-03-01","endDate": "","projectStage": "正在进行中"}
]
src\mock\data\project_role.json
{"projectAA": [{"id": 1,"projectId": "projectAA","roleName": "角色名称111","region": "北区","province": "天津","roleProvince": "天津","roleCity": "天津","department": "管理组","roleStatus": "在组","startDate": ""}]
}
有了数据结构,那么根据官网的例子再扩展一番,就能得到以下:
src\mock\modules\project.js
import Mock from 'mockjs'
const baseUrl = 'http://localhost'import projectData from '../data/projects.json'// 项目列表
Mock.mock(/\/project\/list/, 'get', (options) => {const url = new URL(options.url, baseUrl)const params = new URLSearchParams(url.search)const pageNum = params.get('pageNum') || 1const pageSize = params.get('pageSize') || 10const projectId = (params.get('projectId') || '').toLowerCase()const projectStage = (params.get('projectStage') || '').toLowerCase()const startDateRange = params.get('firstStartDate') || ''const endDateRange = params.get('endDate') || ''const filteredProjects = projectData.filter((project) => {const projectStartDate = new Date(project.firstStartDate)const projectEndDate = new Date(project.endDate)const startDate = new Date(startDateRange)const endDate = new Date(endDateRange)return ((!projectId || project.projectId.toLowerCase().includes(projectId)) &&(!projectPhase || project.projectPhase.toLowerCase().includes(projectPhase)) &&(!projectStage || project.projectStage.toLowerCase().includes(projectStage)) &&(!startDateRange || projectStartDate >= startDate) &&(!endDateRange || projectEndDate <= endDate))})const total = filteredProjects.lengthconst start = (pageNum - 1) * pageSizeconst end = start + parseInt(pageSize)const pageData = filteredProjects.slice(start, end)return {code: 200,msg: '操作成功',data: {list: pageData,total: total,allList: filteredProjects}}
})import projectAndRoleData from '../data/project_role.json'
Mock.mock(/\/project\/role\/data\/list/, 'get', (options) => {const url = new URL(options.url, baseUrl)const params = new URLSearchParams(url.search)const projectId = (params.get('projectId') || '').toLowerCase()const pageNum = parseInt(params.get('pageNum')) || 1const pageSize = parseInt(params.get('pageSize')) || 10const roleId = (params.get('roleId') || '').toLowerCase()const roleName = (params.get('roleName') || '').toLowerCase()const department = (params.get('department') || '').toLowerCase()// 过滤项目数据const filteredProjects = Object.keys(projectAndRoleData).filter((key) => !projectId || key.toLowerCase() === projectId) // 按 projectId 筛选.map((key) => projectAndRoleData[key]) // 获取 projectId 对应的数据.flat() // 将结果从嵌套的数组展平// 进一步过滤数据const filteredRoles = filteredProjects.filter((role) => {return ((!roleId || role.roleId.toLowerCase().includes(roleId)) &&(!roleName || role.roleName.toLowerCase().includes(roleName)) &&(!department || role.department.toLowerCase().includes(department)))})const total = filteredRoles.lengthconst start = (pageNum - 1) * pageSizeconst end = start + pageSizeconst pageData = filteredRoles.slice(start, end)return {code: 200,msg: '操作成功',data: {list: pageData,total: total,allList: filteredRoles}}
})
以上主要做了这些工作:支持大小写、模糊搜索;支持数字类型的输入;支持日期范围筛选;支持分页
三、总结
上面只是讲了一个简单的例子,关于前端处理列表,其实通过这个,前端可以讲所有的从服务器端获取数据的操作,都通过mock进行拦截,然后自定义返回数据,只是我这里是写一个demo,主要是展示数据,所以对于返回的数据,我并没有做很多处理,只是简单的返回了数据,如果大家有需要,可以自己根据需要,对返回的数据进行处理。
相关文章:

前端mock了所有……
目录 一、背景描述 二、开发流程 1.引入Mock 2.创建文件 3.需求描述 4.Mock实现 三、总结 一、背景描述 前提: 事情是这样的,老板想要我们写一个demo拿去路演/拉项目,有一些数据,希望前端接一下,写几个表格&a…...

fiddler抓包10_列表显示请求方法
① 请求列表表头,鼠标悬停点击右键弹出选项菜单。 ② 点击“Customize columns”(定制列)。 ③ 弹窗中,“Collection”下拉列表选择“Miscellaneous”(更多字段)。 ④ “Field Name”选择“RequestMethod”…...

Win10系统复制、粘贴、新建、删除文件或文件夹后需要手动刷新的解决办法
有些win10系统可能会出现新建、粘贴、删除文件或文件夹后保持原来的状态不变,需要手动刷新,我这边新装的几个系统都有这个问题,已经困扰很久了,我从微软论坛和CSDN社区找了了很多方法都没解决,微软工程师给的建议包括重…...

BERT训练环节(代码实现)
1.代码实现 #导包 import torch from torch import nn import dltools #加载数据需要用到的声明变量 batch_size, max_len 1, 64 #获取训练数据迭代器、词汇表 train_iter, vocab dltools.load_data_wiki(batch_size, max_len) #其余都是二维数组 #tokens, segments, vali…...
必须执行该语句才能获得结果
UncategorizedSQLException: Error getting generated key or setting result to parameter object. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须执行该语句才能获得结果。 ; uncategorized SQLException; SQL state [null]; error code [0]; 必须执行该语句…...

AI论文写作可靠吗?分享5款论文写作助手ai免费网站
AI论文写作的可靠性是一个备受关注的话题。在当前的技术背景下,AI写作工具能够显著提高论文写作的效率和质量,但其可靠性和安全性仍需谨慎评估。 AI论文写作的可靠性 技术能力与限制 AI论文写作的质量很大程度上取决于用户提供的输入指令或素材的质量…...

AJAX 入门 day3 XMLHttpRequest、Promise对象、自己封装简单版的axios
目录 1.XMLHttpRequest 1.1 XMLHttpRequest认识 1.2 用ajax发送请求 1.3 案例 1.4 XMLHttpRequest - 查询参数 1.5 XMLHttpRequest - 数据提交 2.Promise 2.1 Promise认识 2.2 Promise - 三种状态 2.3 案例 3.封装简易版 axios 3.1 封装_简易axios_获取省份列表 3…...

oracle avg、count、max、min、sum、having、any、all、nvl的用法
组函数 having的使用 any的使用 all的使用 nvl 从执行结果来看,nvl(列名,默认值),nvl的作用就是如果列名所在的这一行出现空则用默认值替换...
Python一分钟:装饰器
一、装饰器基础 函数即对象 在python中函数可以作为参数传递,和任何其它对象一样如:str、int、float、list等等 def say_hello(name):return f"Hello {name}"def be_awesome(name):return f"Yo {name}, together were the awesomest!"def gr…...

Docker部署ddns-go教程(包含完整的配置过程)
本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \...

简单多状态dp第三弹 leetcode -买卖股票的最佳时机问题
309. 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含冷冻期 分析: 使用动态规划解决 状态表示: 由于有「买入」「可交易」「冷冻期」三个状态,因此我们可以选择用三个数组,其中: ▪ dp[i][0] 表示:第 i 天结束后,…...

游戏化在电子课程中的作用:提高参与度和学习成果
游戏化,即游戏设计元素在非游戏环境中的应用,已成为电子学习领域的强大工具。通过将积分、徽章、排行榜和挑战等游戏机制整合到教育内容中,电子课程可以变得更具吸引力、激励性和有效性。以下是游戏化如何在转变电子学习中发挥重要作用&#…...

php+mysql安装
1.卸载mysql 没启动不停止 2.下载 3.解压 4.点击安装 5.出现成功 端口占用修改 修改端口89或者87 可视化扩展 修改后重启 开启扩展...

音视频入门基础:FLV专题(5)——FFmpeg源码中,判断某文件是否为FLV文件的实现
一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.flv 可以判断出某个文件是否为FLV文件: 所以FFmpeg是怎样判断出某个文件是否为FLV文件呢?它内部其实是通过flv_probe函数来判断的。从《FFmpeg源码:av_probe_input_format3函数和AVI…...

Tomcat 乱码问题彻底解决
1. 终端乱码问题 找到 tomcat 安装目录下的 conf ---> logging.properties .修改ConsoleHandler.endcoding GBK (如果在idea中设置了UTF-8字符集,这里就不需要修改) 2. CMD命令窗口设置编码 参考:WIN10的cmd查看编码方式&am…...
RGB颜色模型
RGB颜色模型是一种广泛应用于数字图像和计算机图形领域的颜色表示方法 一、基本概念 RGB 代表红色(Red)、绿色(Green)和蓝色(Blue)三种基本颜色。这些颜色被视为加色模型中的原色,意味着它们可…...
智能工厂的软件设计 创新型原始制造商(“创新工厂“)的Creator原型(统一行为理论)之2
Q8、今天我们继续昨天开始的 “智能工厂的软件设计”以“统一行为理论”为指导原则的 创新型原始制造商的Creator伪代码--创新工厂“原型”。这是在前述将“程序program”问题的三个体现“方面”(逻辑/语言/数学) 视为符号学的三分支(语用语义…...

【个人博客hexo版】hexo安装时会出现的一些问题
项目场景: 项目场景:在完成了GitHub仓库和git的连接之后,就要新建一个文件夹(例如hexo blog)进行下一步hexo的使用 问题描述 例如:如图所示 原因分析: 这些error不用看它到底是什么…...

道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路
道路裂缝,坑洼,病害数据集 包括无人机视角,摩托车视角,车辆视角 覆盖道路所有问题 一共有八类16000张 1到7依次为: [横向裂缝, 纵向裂缝, 块状裂缝, 龟裂, 坑槽, 修补网状裂缝, 修补裂缝, 修补坑槽] 道路病害(如裂缝、…...
java接口文档配置
接口文档配置 一. swagger与knife4j 配置 1. 导入依赖 <!--swagger接口文档说明--> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId> </dependency> <dependency><groupId>…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

今日行情明日机会——20250609
上证指数放量上涨,接近3400点,个股涨多跌少。 深证放量上涨,但有个小上影线,相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析(基于最新图片数据) 1. 医药(11家涨停) 代表标…...