当前位置: 首页 > news >正文

RuoYi使用本地mock模拟数据

1. RuoYi使用本地mock模拟数据

在 RuoYi项目中使用本地 Mock 数据,最直接的方式是集成 Mock.js 库。Mock.js 可以拦截前端的 Ajax 请求,并返回你预先定义好的模拟数据,让你在后端服务就绪前就能独立进行开发和调试。

1.1. 思路

1.1.1. 安装 Mock.js

npm install mockjs--save-dev

yarn add mockjs-D

1.1.2. 创建 Mock 数据文件

在 src 目录下创建一个名为 mock 的文件夹,并在其中新建一个 index.js 文件。这个文件将作为所有 Mock 配置的入口。
在 src/mock/index.js 中,你可以开始定义接口和模拟数据。Mock.js 的 Mock.mock() 方法用于拦截特定的 API 请求。

// src/mock/index.jsimport Mock from'mockjs'// 1. 模拟用户登录接口Mock.mock('/auth/login','post',(options)=>{// 可以在这里解析 options.body 来获取登录信息,进行简单的校验return{code:200,msg:'操作成功',data:{token:'mock-token-'+newDate().getTime()}}})// 2. 模拟获取用户信息接口Mock.mock('/system/user/getInfo','get',()=>{return{code:200,msg:'操作成功',data:{user:{userId:1,userName:'admin',nickName:'管理员'},roles:['admin'],permissions:['*:*:*']}}})// 3. 模拟一个列表数据(使用 Mock.js 的语法糖)Mock.mock('/api/list','get',()=>{returnMock.mock({'list|1-10':[{// 随机生成1-10条数据'id|+1':1,'name':'@cname',// 随机中文名'age|18-60':1,// 18-60之间的随机年龄'address':'@county(true)'// 随机地址}]})})// 你可以在这里继续添加更多接口...

1.1.3. 在项目中导入 Mock 配置

为了让 Mock 配置生效,你需要在项目的入口文件 main.js 或 main.ts 中导入刚才创建的 mock/index.js 文件。

// src/main.jsimport{createApp}from'vue'import App from'./App.vue'// 本地模拟数据开发环境加载Mockif(import.meta.env.DEV){// 添加这一行,导入 Mock 配置import('./mock')}// ... 其他代码createApp(App).mount('#app')

当后端接口完成后,只需注释掉 Mock 导入即可切换到真实接口:

// src/main.jsimport{createApp}from'vue'import App from'./App.vue'// 本地模拟数据开发环境加载Mockif(import.meta.env.DEV){// 添加这一行,导入 Mock 配置// import('./mock')}// ... 其他代码createApp(App).mount('#app')

1.1.4. 注意事项

(1)环境隔离:建议只在开发环境启用 Mock。可以通过环境变量(如 import.meta.env.MODE)来控制是否导入 @/mock,避免在生产环境中引入不必要的代码。
(2)接口路径:确保 Mock.mock() 中的路径与你代码中 axios 请求的路径完全一致。
(3)请求方法:Mock.mock() 的第三个参数是请求方法(如 ‘get’、‘post’),请务必与你的请求方法匹配。
(4)Vite 代理:如果你在 vite.config.js 中配置了代理(proxy),需要确保 Mock 的拦截优先级更高,或者直接 Mock 最终请求的完整路径。

1.2. 导入 Mock 后数据如何使用

导入 Mock 后,数据并不会自动填充到页面上。它只是在你调用 API 接口时,拦截请求并返回你定义的模拟数据。你依然需要像调用真实后端接口一样,在前端代码中主动发起请求并处理返回的数据。
结合 RuoYi-Cloud-Vue3 的代码规范,具体使用流程分为以下三步:

1.2.1. 第一步:在 src/api/ 中定义接口函数(照常写)

你不需要修改 API 文件,Mock 会无缝替换真实的网络请求。
例如,在 src/api/system/user.js 中,你原本怎么写,现在还怎么写:

// src/api/system/user.jsimport request from'@/utils/request'// 获取用户列表(这个函数保持不变)export functionlistUser(query){returnrequest({url:'/system/user/list',// 这个路径会被 Mock 拦截method:'get',params:query})}

1.2.2. 在 Vue 组件中调用接口并赋值(照常写)

在页面的

<template><div><!--3.在模板中渲染数据--><p v-for="item in userList":key="item.id">{{item.userName}}-{{item.nickName}}</p></div></template><script setup>import{ref,onMounted}from'vue'// 1. 导入定义好的 API 函数import{listUser}from'../api/system/user'// 定义响应式数据,用来存放 Mock 返回的数据constuserList=ref([])// 2. 在生命周期或事件中调用接口constfetchData=()=>{listUser({pageNum:1,pageSize:10}).then(res=>{console.log('📦 完整响应数据:',res)// 检查 res 的结构,看是否包含 data.rows// 或者 res.rows,取决于你的 Mock 数据结构userList.value=res.data.rows}).catch(err=>{console.error('❌ 请求失败:',err)})// // 调用 API,此时 Mock 会直接返回你在 mock/index.js 中定义的数据// const res = await listUser({ pageNum: 1, pageSize: 10 })//// // 将 Mock 返回的数据赋值给变量// if (res.code === 200) {// userList.value = res.data // 或者 res.rows,取决于你的 Mock 数据结构// }}onMounted(()=>{fetchData()})</script>

1.2.3. 第三步:确保 Mock 返回的数据结构符合前端预期

你的 Mock 数据必须模拟真实后端返回的 JSON 结构,否则页面会渲染失败。
在 src/mock/index.js 中,返回的数据结构要和 RuoYi 后台的标准格式一致(通常包含 code、msg、data):

// src/mock/index.jsimport Mock from'mockjs'console.log('✅ Mock 文件已加载!')// 模拟用户列表接口// ✅ 用户列表接口(使用正则匹配:能匹配包含该片段的 URL,忽略域名、端口和查询参数。)Mock.mock(/\/system\/user\/list/,'get',(options)=>{try{console.log('🎯 Mock 拦截请求,options:',options)// 模拟若依后台返回的标准分页格式return{code:200,msg:'操作成功',data:{total:100,rows:[{userId:1,userName:'admin',nickName:'管理员'},{userId:2,userName:'ry',nickName:'若依'}]}}}catch(error){console.error('❌ Mock 回调出错:',error)// 返回一个标准的错误响应,避免 500return{code:500,msg:'Mock 数据生成失败:'+error.message}}})

此时,你的组件中 res.data.rows 就能拿到数组并正常渲染了。

1.3. 总结流程图

(1)浏览器渲染页面 -> 执行 onMounted -> 调用 listUser()
(2)request 工具发出 Ajax 请求(路径:/system/user/list)
(3)Mock.js 拦截该请求(路径匹配),直接返回本地定义的 JSON 数据
(4)请求不会经过 Vite Proxy 转发到真实后端
(5)你的 res 接收到 Mock 数据 -> 赋值给 userList -> 页面更新

http://www.jsqmd.com/news/1372402/

相关文章:

  • UE5 PaperSpriteActor源码解析:从2D精灵渲染到性能优化实战
  • 智能命令行助手部署指南:从自然语言到可执行命令的完整实践
  • 【学习笔记】Harness Engineering,模型之外的一切-7/16
  • 用客户的角度了解ISTA3E测试是啥?ISTA3E试验开展
  • 佛山中央空调回收靠谱商家怎么找?2026本土实力企业推荐 - 广东再生资源回收
  • Dify 部署与配置全攻略:从安装到智能客服搭建
  • 深入理解线程生命周期与多线程编程实践
  • 广州厂房拆除回收行业甄选:正规服务商全方位测评 - 广东再生资源回收
  • 终极REPENTOGON脚本扩展器:从零到精通的完整指南
  • 亦唐科技(YIKTONG):智能制造引领国产贴片机行业的新时代
  • 终极指南:如何用免费开源工具Seraphine提升你的英雄联盟游戏体验
  • 智能充电桩选购指南:核心参数与高端体验解析
  • stltostp:重构3D制造到设计的桥梁,极速实现STL到STEP格式的智能转换
  • 从 UN R155 到 ISO 21434:汽车供应链为何正在要求 SBOM?
  • Unreal Engine集成Geoserver WMTS瓦片:三维GIS与游戏引擎融合实践
  • 国密门禁企业怎么选?2026年最新3个避坑要点
  • Python GUI开发入门:Tkinter基础与实践指南
  • 企业为什么需要AI数据平台?真正的问题可能不是模型,而是业务上下文
  • AI大模型与编程工具核心技术解析及实践指南
  • Sketchbook Pro室内设计高效草图:从透视网格到方案故事板的实战指南
  • 机器人的前世今生与未来
  • 企业管理:企业认证
  • C++访问者模式:双重分发机制与实战应用
  • 英雄联盟玩家如何通过本地化工具箱提升游戏体验?
  • 2026安巢经开区考执业药师缺前置学历?电大中专药剂/中药专业报考详解!怎么报名?联系方式是多少? - 最新资讯
  • Windows使用Codex + Remotion:从自然语言生成动效到MP4导出
  • 冒险岛怀旧服 G1002 登录报错、黑屏卡顿、无法初始化修复教程
  • AI教育陷入“高科技题海”?从工具思维到认知伙伴的范式跃迁
  • GPT-Live文件与项目功能:AI编程助手如何实现项目感知与上下文感知
  • 昆明沃尔沃专修认准云南沃之捷,配件溯源可查,明确质保标准规避售后纠纷 - 专业优选推荐榜