前端mock了所有……

news2024/11/13 6:33:01

目录

一、背景描述

二、开发流程

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') || 1
  const pageSize = params.get('pageSize') || 10
  const 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.length
  const start = (pageNum - 1) * pageSize
  const 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')) || 1
  const pageSize = parseInt(params.get('pageSize')) || 10
  const 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.length
  const start = (pageNum - 1) * pageSize
  const end = start + pageSize
  const pageData = filteredRoles.slice(start, end)

  return {
    code: 200,
    msg: '操作成功',
    data: {
      list: pageData,
      total: total,
      allList: filteredRoles
    }
  }
})

以上主要做了这些工作:支持大小写、模糊搜索;支持数字类型的输入;支持日期范围筛选;支持分页


三、总结

上面只是讲了一个简单的例子,关于前端处理列表,其实通过这个,前端可以讲所有的从服务器端获取数据的操作,都通过mock进行拦截,然后自定义返回数据,只是我这里是写一个demo,主要是展示数据,所以对于返回的数据,我并没有做很多处理,只是简单的返回了数据,如果大家有需要,可以自己根据需要,对返回的数据进行处理。

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

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

相关文章

Linux进程间通信——探索共享内存—— 剖析原理, 学习接口应用

前言&#xff1a;本节内容主要讲解进程间通信的&#xff0c; systemV版本下的共享内存。 共享内存&#xff0c;顾名思义&#xff0c; 其实就是一块内存&#xff0c; 它不同于管道是一个文件。 所以它的传输速度是很快的。 因为管道是文件&#xff0c;有缓冲区&#xff0c; 而共…

Day99 代码随想录打卡|动态规划篇--- 01背包问题

题目&#xff08;卡玛网T46&#xff09;&#xff1a; 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&am…

LeRobot - 让现实机器人更易学

文章目录 一、关于 LeRobot特点模拟环境中预训练模型的示例 致谢教程 - Getting Started with Real-World Robots 二、安装三、Walkthrough1、可视化数据集2、LeRobotDataset的格式3、评估预先训练的策略4、训练你自己的政策复制最先进的&#xff08;SOTA&#xff09; 四、贡献…

Vue3 中 Aos 动画同时触发的解决办法

文章目录 问题现象解决之后的效果解决办法问题猜测 问题现象 我总共有四行数据&#xff0c;每一行都是一个动画&#xff0c;但是触发第一个之后其他三个也都触发了 我想要的效果是&#xff1a;动画从底部出现的时候触发一个动画&#xff0c;不要都触发掉 解决之后的效果 解决…

智慧卫生间系统:引领公共卫生间管理的新时代@卓振思众

随着城市化进程的加快&#xff0c;公共卫生间的使用频率不断增加。如何提升公共卫生间的使用体验、管理效率以及卫生水平&#xff0c;已成为各地政府和管理者关注的焦点。智慧卫生间系统应运而生&#xff0c;成为解决这一问题的重要工具。它结合了物联网技术和智能管理理念&…

四、Cookie 和 Session

文章目录 1. Cookie 饼干1.1 什么是 Cookie?1.2 如何创建 Cookie1.3 服务器如何获取 Cookie1.4 Cookie 值的修改1.5 浏览器查看 Cookie1.6 Cookie 生命控制&#xff08;指浏览器中Cookie的存在时间&#xff09;1.7 Cookie 有效路径 Path 的设置 2. Session 会话2.1 什么是 Ses…

Canopen-pn有线通信标准在汽车制造中至关重要

电子元件越来越多地被集成到车辆中&#xff0c;从而实现与物联网世界的连接。该行业中主要的高速串行接口方法包括控制器局域网 (CAN) 总线 。CAN 是运输应用中使用的一种强大的总线标准。它旨在允许微控制器(MCU) 和相关组件与彼此的应用程序进行通信。这无需系统具有主机即可…

从入门到精通,带你探索适合新手的视频剪辑工具

用视频来分享生活已经变成越来越多人的一种习惯&#xff0c;很多时候视频并不能一镜到底&#xff0c;所以还需要一些的修改、剪辑操作&#xff0c;那么这次我将介绍几款视频剪辑工具&#xff0c;希望能够让你分享的道路更加通畅。 1.FOXIT视频剪辑 连接直达>>https://w…

【项目设计】Facial-Hunter

目录 一、项目介绍 二、开发环境以及技术 三、项目架构设计 3.1 项目总体架构 3.2 客户端架构 3.3 主服务端架构 3.4 处理服务端架构 3.5 数据库设计 四、FaceNet 五、代码实现 一、项目介绍 该项目是基于深度学习与负载均衡的人脸识别系统 该项目主要由三个部分组…

【Elasticsearch系列十二】聚合-电视案例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

反射的相关内容

目录 一、什么是反射 二、为什么会有反射 三、反射是如何工作的 获取类信息的三种方式&#xff1a; 例&#xff1a; 四、获取类信息并调用 1.获取 &#xff08;1&#xff09;获取变量 获取全部类信息 获取public修饰的 获取指定某一个 &#xff08;2&#xff09;…

【新手上路】衡石分析平台使用手册-租户管理

租户管理​ 衡石系统支持服务一个平台方和多个企业客户的租户模式&#xff0c;平台方管理租户&#xff0c;为租户提供数据&#xff0c;租户在系统内进行数据分析。 衡石系统增加工作空间的设计&#xff0c;在平台方和租户之间提供单向的传递通道&#xff0c;平台厂商可以轻松…

C++map,set,multiset,multimap详细介绍

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set set的介绍 set的使用 1. set的模板参数列表 2. set的构造 3. set的迭代器 4. set的容量 5. set的修改操作 6. set的使用举例 ​3.2 map map的介绍 map的使用 1. map的模板参数声明 2. map的构造 …

实例讲解电动汽车钥匙ON挡上下电控制策略及Simulink建模方法

在电动汽车VCU开发中&#xff0c;上下电控制是其中一个核心控制内容&#xff0c;也是其他控制功能的基础&#xff0c;而钥匙ON挡上下电又是整车上下电的基础。本文介绍电动汽车钥匙ON挡上下电的控制策略及Simulink建模方法。 目录 一、整车高压原理 二、钥匙ON挡上下电控制策…

计算机毕业设计 办公用品管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(一)

目录 自动化介绍 bord 边框宽度 随机函数 fsvp 随机颜色 move 自动化介绍 自动化介绍:简单来说自动化能让所有字幕行快速拥有你指定的同一种特效 对时间不同的行应用相同的效果 只要设计好一个模板&#xff0c;然后让所有行都执行这个模板上的特效就好了 首先制作模板行…

kafka消息发送几种方式

同步发送 or 异步发送 消息发送根据是否需要处理发送的结果分为同步发送、异步发送。 同步发送&#xff1a;等待发送结果返回&#xff0c;这种方式是可靠的&#xff0c;因为异常能及时处理&#xff0c;但同步发送需要阻塞等待一条消息发送完才处理下一条&#xff0c;吞吐量差。…

esp32核心跑分程序

https://github.com/ochrin/coremark/tree/esp32 最近一直捣腾esp32s3 (Sense) 做微型摄像。过程中发现一款不错的跑分软件&#xff0c;特此记一笔。 其中针对esp32s3各类参数设定&#xff08;用idf.py menuconfig)&#xff0c;做个记录。 CPU Frequency去240MHz&#xff08…

探索网络世界:TCP/IP协议、Python Socket编程及日常生活比喻

网络介绍 &#x1f310; 网络就像是一个无形的纽带&#xff0c;把我们所有人&#x1f46b;&#x1f46b;&#x1f46b;紧紧相连。没有网络的世界&#xff0c;就像是失去了色彩的画布&#xff0c;多么的单调和无趣啊&#xff01;&#x1f3a8; 单机游戏 &#x1f3ae; 单机游…

ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计

起因&#xff0c; 目的: 客户需求, 就是要设计一个数据库。 过程&#xff0c; 关于工具: UI 设计&#xff0c;我最喜欢的工具其实是 Canva, 但是 Canva 没有合适的模板。我用的是 draw.io, 使用感受是&#xff0c;很垃圾。 各种快捷键不适应&#xff0c;箭头就是点不住&…